SQL Server中如何将EST等本地时区列转换为考虑夏令时的UTC时区
SQL本地时区(含夏令时)转UTC实现方案
正确转换写法
如果你的dateTimeField字段存储的是指定时区的本地时间,可直接通过两次AT TIME ZONE调用完成转换,无需复杂的偏移计算,自动适配夏令时规则:
EST转UTC示例
-- 查询转换结果 SELECT dateTimeField AT TIME ZONE 'Eastern Standard Time' AT TIME ZONE 'UTC' AS utc_datetime
持久化到新列的实现
如果需要把转换结果存入新字段,参考以下语句:
-- 新增UTC时间存储列,可根据业务需要调整字段类型为DATETIME/DATETIME2 ALTER TABLE 你的表名 ADD utc_datetime DATETIME2 NULL; -- 批量转换EST时间为UTC并写入新列 UPDATE 你的表名 SET utc_datetime = dateTimeField AT TIME ZONE 'Eastern Standard Time' AT TIME ZONE 'UTC';
其他时区适配
如果需要转换PST、CST等其他时区的时间,替换第一次AT TIME ZONE后的时区名即可:
- PST(太平洋标准时间):
'Pacific Standard Time' - CST(中部标准时间):
'Central Standard Time'
逻辑说明
两次AT TIME ZONE的作用分别是:
- 第一次调用
AT TIME ZONE '源时区名':给无时区标记的原始时间字段,绑定对应源时区的偏移信息,会自动根据时间值匹配夏令时/冬令时的实际偏移量 - 第二次调用
AT TIME ZONE 'UTC':将已经绑定源时区偏移的时间,转换为UTC时区的时间
原有语句问题
你提供的原有语句逻辑是反向的,作用是把UTC时间转换为EST时间,和你需要的EST转UTC需求刚好相反:
SELECT CONVERT(datetime, SWITCHOFFSET(dateTimeField, DATEPART(TZOFFSET, dateTimeField AT TIME ZONE 'Eastern Standard Time')))
注意事项
- 以上时区命名为Windows环境下SQL Server的标准时区名,如果你使用Linux环境部署的SQL Server,需要替换为IANA时区名:EST对应
'America/New_York'、PST对应'America/Los_Angeles'、CST对应'America/Chicago' - 转换全程自动适配夏令时规则,无需手动处理夏令时时间段的偏移调整
内容的提问来源于stack exchange,提问作者amit agarwal
相关产品推荐
相关产品推荐

