为何SQL中大西洋标准时间的时区转换结果错误?
问题原因与解决方法
问题根源
你用的查询逻辑存在误区:DATEPART(tz, GETUTCDATE() AT Time Zone 'Atlantic Standard Time')返回的是该时区当前实际生效的偏移量,包含夏令时调整。大西洋标准时间对应的时区会在夏令时切换为大西洋夏令时,偏移从-04:00变为-03:00。你的示例时间2022-09-12正处于夏令时时段,所以取到的偏移是-180分钟(-3小时),加到UTC时间16:00上就得到了13:00,和实际输出一致。
正确的转换方法
要正确将UTC时间转换为指定时区的时间(自动处理夏令时),直接使用AT TIME ZONE的标准转换语法即可:
-- 标准写法:先标记UTC时区,再转换到目标时区 SELECT GETUTCDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Atlantic Standard Time' AS atlantic_ts
或者更简洁的写法(GETUTCDATE()本身就是UTC时间,可直接转换):
SELECT CAST(GETUTCDATE() AT TIME ZONE 'Atlantic Standard Time' AS DATETIME) AS atlantic_ts
用这个查询,2022-09-12 16:00:00.000的UTC时间会根据夏令时规则,正确返回13:00:00.000;如果是冬令时时段(比如12月),则自动返回12:00:00.000。
如果需求是强制使用标准时间偏移(-04:00),忽略夏令时,可手动固定偏移:
SELECT DATEADD(HOUR, -4, GETUTCDATE()) AS atlantic_standard_ts
但这种写法不会自动处理夏令时切换,仅适用于固定偏移的场景。
内容的提问来源于stack exchange,提问作者Fathimathul Farzidha
相关产品推荐
相关产品推荐

