从字符串向 datetime 转换时失败。

时间:2022-01-31 21:26:26
省份证号18位  截取后插入生日字段ShengRi(smalldatetime)

update t_user set ShengRi=
     (CASE 
WHEN isdate(substring(ZhengJianHM,7,4)+'-'+substring(ZhengJianHM,11,2)+'-'+substring(ZhengJianHM,13,2))=0 THEN null
        when datediff(dd,ZhengJianHM,'1900-01-01')>0 then null
    when datediff(dd,ZhengJianHM,'2079-06-06')>0  then null
        else convert(datetime,substring(ZhengJianHM,7,4)+'-'+substring(ZhengJianHM,11,2)+'-'+substring(ZhengJianHM,13,2),120) 
  end)
where len(ZhengJianHM)=18


报错,急人呀

15 个解决方案

#1


用ltrim转换下

#2


select cast(substring('420625198801153512',7,8) as datetime)

/*
                                                       
------------------------------------------------------ 
1988-01-15 00:00:00.000

(所影响的行数为 1 行)

*/

#3


select cast(substring('420625198801153512',7,8) as datetime)
select convert(datetime,substring('420625198801153512',7,8))

#4


有可能数据是错的,

#5


引用 4 楼 weijiajia11 的回复:
有可能数据是错的,


插入数据的时候怎么不规范一下,

case when isdate(cast(substring(ZhengJianHM,7,8) as datetime))=1 then cast(substring(ZhengJianHM,7,8
     else '1900-01-01' end 

#6


引用 4 楼 weijiajia11 的回复:
有可能数据是错的,

你不是用ISDATE转换了吗

#7


该回复于2010-12-02 16:06:13被版主删除

#8


case when isdate(cast(substring(ZhengJianHM,7,8) as datetime))=1 then cast(substring(ZhengJianHM,7,8
     else '1900-01-01' end 


关键字 'else' 附近有语法错误。

#9


select cast(substring('420625198801153512',7,8) as datetime)
select convert(datetime,substring('420625198801153512',7,8))

还是报错
将 expression 转换为数据类型 datetime 时出现算术溢出错误。

#10



查一查有没有数据时错误的
select * from table 
where isdate(substring(column,7,8)) = 0 

#11


152601195209321532
D20042813190638661


这样的数据都有,没法处理,
着急呀

#12


请高手帮帮忙呀,急死了

#13


先用isdate()把不是日期格式的剔出。。。

#14


或者case when isdate(...) = 1 then convert() else ... end

#15


引用 14 楼 acen_chen 的回复:
或者case when isdate(...) = 1 then convert() else ... end

#1


用ltrim转换下

#2


select cast(substring('420625198801153512',7,8) as datetime)

/*
                                                       
------------------------------------------------------ 
1988-01-15 00:00:00.000

(所影响的行数为 1 行)

*/

#3


select cast(substring('420625198801153512',7,8) as datetime)
select convert(datetime,substring('420625198801153512',7,8))

#4


有可能数据是错的,

#5


引用 4 楼 weijiajia11 的回复:
有可能数据是错的,


插入数据的时候怎么不规范一下,

case when isdate(cast(substring(ZhengJianHM,7,8) as datetime))=1 then cast(substring(ZhengJianHM,7,8
     else '1900-01-01' end 

#6


引用 4 楼 weijiajia11 的回复:
有可能数据是错的,

你不是用ISDATE转换了吗

#7


该回复于2010-12-02 16:06:13被版主删除

#8


case when isdate(cast(substring(ZhengJianHM,7,8) as datetime))=1 then cast(substring(ZhengJianHM,7,8
     else '1900-01-01' end 


关键字 'else' 附近有语法错误。

#9


select cast(substring('420625198801153512',7,8) as datetime)
select convert(datetime,substring('420625198801153512',7,8))

还是报错
将 expression 转换为数据类型 datetime 时出现算术溢出错误。

#10



查一查有没有数据时错误的
select * from table 
where isdate(substring(column,7,8)) = 0 

#11


152601195209321532
D20042813190638661


这样的数据都有,没法处理,
着急呀

#12


请高手帮帮忙呀,急死了

#13


先用isdate()把不是日期格式的剔出。。。

#14


或者case when isdate(...) = 1 then convert() else ... end

#15


引用 14 楼 acen_chen 的回复:
或者case when isdate(...) = 1 then convert() else ... end