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
相关产品推荐
相关产品推荐

