日期:2014-05-18  浏览次数:20594 次

从请教Sql语句从18位身份证号生成出生日期
mssql2008express中
update baseinfo set chushengriqi=
convert(datetime,
''''+
+substring(CONVERT(char(4),shenfenzhenghao),7,4)+'-'
+substring(CONVERT(char(2),shenfenzhenghao),11,2)+'-'
+substring(CONVERT(char(2),shenfenzhenghao),13,2)+''''
)
where ShenFenZhengHao is not null
and len(ShenFenZhengHao)=18
老提示:
Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.

为什么呢?或者还有什么更简单的办法?

------解决方案--------------------
为什么不指中间那段SELECT出来看看是什么结果呢?
''''+
+substring(CONVERT(char(4),shenfenzhenghao),7,4)+'-'
+substring(CONVERT(char(2),shenfenzhenghao),11,2)+'-'
+substring(CONVERT(char(2),shenfenzhenghao),13,2)+''''
------解决方案--------------------
不用substring来substring去了。

直接取了那8位数,直接可以转成时间类型了。
------解决方案--------------------
加一个isdate识别一下,去除无效的数据
SQL code

update baseinfo 
set chushengriqi = substring(shenfenzhenghao,7,4) + '-'+ substring(shenfenzhenghao,11,2) + '-'+ substring(shenfenzhenghao,13,2)
where where ShenFenZhengHao is not null
and len(ShenFenZhengHao)=18
and isdate(substring(shenfenzhenghao,7,4) + '-'+ substring(shenfenzhenghao,11,2) + '-'+ substring(shenfenzhenghao,13,2)) = 1