如何在SQL Server中将带时区的日期字符串转换为带时区DateTime?
SQL Server转换带时区日期字符串的最优方法
微软自有系统(从Dynamics365 Outbound Marketing同步到Azure Data Lake Storage)传递的日期字符串格式为02/20/2023 13:37:24 +00:00,需要在SQL Server中将其转换为带时区信息的日期时间类型。此前尝试了以下转换语句:
SELECT CONVERT(DateTime, '02/20/2023 13:37:24 +00:00', 122) SELECT CONVERT(DateTime, '02/20/2023 13:37:24 +00:00', 111)
执行后出现错误:
SQL Error [241] [S0001]: 转换日期和/或时间从字符串失败。
问题原因
DateTime类型本身不存储时区信息,SQL Server的CONVERT函数使用122、111等样式时,无法解析字符串末尾的时区偏移部分(+00:00)。- 这些样式对应的格式定义中不包含时区偏移,因此直接转换会触发格式匹配失败。
最优解决方案
要保留时区信息,应该使用SQL Server支持的带时区的日期时间类型datetimeoffset,以下是几种可靠的转换方式:
方法1:直接转换为datetimeoffset
SQL Server原生支持解析这种带偏移的字符串格式,无需指定样式:
-- 直接转换,格式不匹配时会报错 SELECT CONVERT(datetimeoffset, '02/20/2023 13:37:24 +00:00') -- 推荐:使用TRY_CONVERT避免转换失败导致整个查询中断,失败时返回NULL SELECT TRY_CONVERT(datetimeoffset, '02/20/2023 13:37:24 +00:00')
方法2:使用PARSE函数指定区域
如果需要明确指定日期格式的区域(比如原字符串是美式日期格式),可以用PARSE函数:
SELECT PARSE('02/20/2023 13:37:24 +00:00' AS datetimeoffset USING 'en-US')
补充:若需转换为本地时间(不带时区)
如果业务不需要保留时区信息,仅需转换为本地DateTime,可以先转成datetimeoffset再转换为DateTime:
SELECT CONVERT(DateTime, CONVERT(datetimeoffset, '02/20/2023 13:37:24 +00:00'))
内容的提问来源于stack exchange,提问作者Keith H
相关产品推荐
相关产品推荐

