SQL Server中带UTC后缀的nvarchar值转date类型报错解决方案
报错根因
两种原生写法转换失败的核心原因是字段值末尾携带了UTC时区标识,SQL Server的DATE、DATETIME类型无法直接解析带该后缀的时间字符串;同时字段定义为nvarchar(max),如果混入不符合格式的脏值也会导致转换中断。针对你给出的2021-12-30 02:22:24 UTC格式标准值,以下方案可稳定返回2021-12-30格式的日期结果。
可用转换方案
方案1:字符串清洗后转换(全SQL Server版本兼容)
先替换掉字符串末尾的UTC标识,再做类型转换,该写法同时兼容字段内不带UTC后缀的值:CAST(REPLACE(columnName, ' UTC', '') AS DATE) AS convertedDate方案2:借助时区类型自动解析(SQL Server 2008及以上版本支持)
DATETIMEOFFSET类型原生支持识别UTC标识的时间字符串,无需手动做字符串替换即可完成转换:CAST(CAST(columnName AS DATETIMEOFFSET) AS DATE) AS convertedDate
异常排查方法
如果使用上述方案仍触发转换报错,说明字段内存在非标准格式的脏数据,可通过以下语句定位无效值:
SELECT columnName FROM 你的表名 WHERE TRY_CAST(REPLACE(columnName, ' UTC', '') AS DATE) IS NULL
查询返回的结果就是无法被正常解析的脏值,清洗完成后即可全量转换无报错。
注意:样式码
23对应的是纯yyyy-MM-dd格式的日期字符串,你的字段值包含时间部分和UTC后缀,直接用CONVERT(DATE, columnName, 23)无法匹配格式规则,必然转换失败。
内容的提问来源于stack exchange,提问作者BonusCup
相关产品推荐
相关产品推荐

