SQL Server中如何将'01-Jan-2022 05:17:13 PM CST'转为datetime?Convert函数失效
解决SQL Server中带时区缩写的字符串转datetime问题
针对格式为'01-Jan-2022 05:17:13 PM CST'的字符串,直接用CONVERT函数无法转换的核心原因是字符串包含时区缩写CST,而CONVERT支持的内置格式不兼容这类带时区标识的模式。以下是几种可行的解决方法:
方法1:移除时区缩写后转换
先通过字符串替换去掉CST部分,再使用CAST或CONVERT结合匹配的格式样式完成转换:
-- 方式1:用CAST移除时区后直接转换 SELECT CAST(REPLACE('01-Jan-2022 05:17:13 PM CST', ' CST', '') AS DATETIME) -- 方式2:用CONVERT指定格式样式(109对应「mon dd yyyy hh:mi:ss:mmmAM/PM」格式) SELECT CONVERT(DATETIME, REPLACE('01-Jan-2022 05:17:13 PM CST', ' CST', ''), 109)
方法2:使用PARSE函数解析带时区的字符串
PARSE函数支持解析包含时区缩写的字符串(依赖CLR环境,大部分SQL Server实例默认开启),可先解析为DATETIMEOFFSET类型,再转换为DATETIME:
SELECT CONVERT(DATETIME, PARSE('01-Jan-2022 05:17:13 PM CST' AS DATETIMEOFFSET USING 'en-US'))
方法3:用TRY系列函数避免转换失败报错
如果存在格式不规范的字符串,建议使用TRY_CAST、TRY_CONVERT或TRY_PARSE,转换失败时会返回NULL而非抛出错误:
-- 使用TRY_CONVERT SELECT TRY_CONVERT(DATETIME, REPLACE('01-Jan-2022 05:17:13 PM CST', ' CST', ''), 109) -- 使用TRY_PARSE SELECT TRY_CONVERT(DATETIME, TRY_PARSE('01-Jan-2022 05:17:13 PM CST' AS DATETIMEOFFSET USING 'en-US'))
注意:若需要保留时区信息,建议直接转换为DATETIMEOFFSET类型,DATETIME本身不存储时区数据。
内容的提问来源于stack exchange,提问作者APRIL
相关产品推荐
相关产品推荐

