SQL Server 2022含EDT的nvarchar日期转datetime报错解决
解决SQL Server中将特定格式字符串转换为datetime的问题
你的转换语句失败主要有两个原因:
- 部分行的时间格式存在错误(比如示例里的
20:25:22 :233,秒和毫秒之间多了空格),仅移除EDT后仍不符合datetime的格式要求 - 未处理转换失败场景,一旦遇到坏数据就会直接报错
针对你的需求,结合SQL Server 2022的特性,提供以下解决方案:
方案1:清理格式后安全转换
用TRY_CAST替代CAST,遇到无法转换的字符串时返回NULL而非报错,同时嵌套REPLACE修复格式问题,通过LEFT和CHARINDEX精准截取EDT之前的内容:
SELECT MyDateValues, TRY_CAST( REPLACE( -- 截取EDT之前的内容并去除右侧空格 RTRIM(LEFT(MyDateValues, CHARINDEX('EDT', MyDateValues) - 1)), -- 修复秒和毫秒之间的空格问题 ' :', ':' ) AS DATETIME ) AS ConvertedDateTime FROM dbo.stringdates
方案2:兼容NULL值的简化写法
如果要自动处理NULL值,用ISNULL避免CHARINDEX在NULL值上报错:
SELECT MyDateValues, TRY_CAST( REPLACE( NULLIF( RTRIM(LEFT(MyDateValues, CHARINDEX('EDT', ISNULL(MyDateValues, '')) - 1)), '' ), ' :', ':' ) AS DATETIME ) AS ConvertedDateTime FROM dbo.stringdates
说明:
CHARINDEX('EDT', MyDateValues)定位EDT的起始位置,LEFT截取到该位置前的内容,无需手动处理EDT前后的空格REPLACE(' :', ':')修复部分行里秒和毫秒之间的多余空格,让时间格式符合HH:mm:ss:fff要求TRY_CAST确保即使存在未修复的坏数据,查询也能正常执行,对应行返回NULL- SQL Server会自动忽略字符串开头的星期标识(如Tue、Sat),无需额外处理
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

