You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure DB中AT TIME ZONE时区转换始终为UTC问题求助

解决SQL Server AT TIME ZONE转换时区始终返回UTC的问题

问题根源

你误解了AT TIME ZONE的工作逻辑,尤其是针对带时区偏移的SYSDATETIMEOFFSET()值的转换方式:

  • 当输入是带时区的datetimeoffset时,AT TIME ZONE '[目标时区]'会直接将该时间转换到目标时区,返回对应偏移的datetimeoffset。
  • 你尝试的双重转换(SYSDATETIMEOFFSET() AT TIME ZONE 'UTC' AT TIME ZONE '...')是错误的:SYSDATETIMEOFFSET() AT TIME ZONE 'UTC'并不是把当前时间转成UTC,而是假设当前的datetimeoffset值属于UTC时区,这会错误调整时间值和偏移量,导致后续转换失效。

可能的额外原因

  • 时区名称不匹配:SQL Server仅识别sys.time_zone_info中存在的时区名称。执行以下语句确认目标时区是否存在:
    SELECT name FROM sys.time_zone_info WHERE name LIKE '%Central European%';
    
    Central European Standard Time是标准名称,但部分环境可能有差异。
  • 服务器时区本身为UTC:如果你的SQL Server服务器时区设置为UTC,SYSDATETIMEOFFSET()会返回+00:00偏移的时间,但转换到中欧时区后,时间值应增加1/2小时(夏令时影响),偏移变为+01:00或+02:00。

正确的转换写法

写法1:直接转换带时区的当前时间

SELECT 
    SYSDATETIMEOFFSET() AS current_server_time,
    -- 直接将当前带时区的时间转换到中欧时区
    SYSDATETIMEOFFSET() AT TIME ZONE 'Central European Standard Time' AS converted_to_central_europe
;

写法2:从UTC时间转换(适合服务器时区非UTC的场景)

SELECT 
    GETUTCDATE() AS utc_time,
    -- 先标记UTC时区,再转换到中欧时区
    GETUTCDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Central European Standard Time' AS utc_to_central_europe
;

验证结果

执行上述查询后,converted_to_central_europe或utc_to_central_europe的偏移应显示为+01:00(非夏令时)或+02:00(夏令时),时间值比UTC时间快1或2小时。

内容的提问来源于stack exchange,提问作者somedude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:32:44