SQL Server将带+00后缀的varchar日期转换为datetime失败如何解决
解决方案
报错的核心原因是常规datetime类型不支持识别带时区偏移后缀的字符串格式,你输入的字符串末尾+00属于UTC时区标识,不在datetime的兼容解析范围内。可以按需求选择以下方案解决:
方案1:截掉时区后缀后转换(适合所有SQL Server版本,时区固定为+00的场景)
直接截取前19位的纯日期时间部分再做转换即可:
-- 固定字符串转换 SELECT CAST(LEFT('2021-05-30 19:00:00+00', 19) AS datetime) -- 字段转换写法 SELECT CAST(LEFT(你的存储日期的varchar字段名, 19) AS datetime) FROM 表名
方案2:通过datetimeoffset中转转换(适合SQL Server 2008及以上版本,时区不固定的通用场景)
datetimeoffset是SQL Server专门用来存储带时区偏移的日期时间类型,可以完美识别你的输入格式,再按需转成普通datetime即可:
转成UTC时间的datetime
SELECT CAST(CAST('2021-05-30 19:00:00+00' AS datetimeoffset) AS datetime)
转成指定时区的datetime
如果需要转成东八区(北京时间)的对应时间,可以配合SWITCHOFFSET函数使用:
SELECT CAST(SWITCHOFFSET(CAST('2021-05-30 19:00:00+00' AS datetimeoffset), '+08:00') AS datetime)
方案3:用CONVERT指定样式码转换
也可以指定ISO8601对应的样式码127做转换,兼容性更好:
SELECT CONVERT(datetime, CONVERT(datetimeoffset, '2021-05-30 19:00:00+00', 127))
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

