基于UTC时间计算指定时区Datetime结果错误,求正确实现方法
解决SQL中UTC转中欧标准时区时间的错误问题
我来帮你理清楚这个问题——你现在的写法搞反了AT TIME ZONE的使用逻辑,这才导致结果出错。咱们一步步拆解原因,再给出正确的解法:
为什么你的代码得到了错误的9:00?
AT TIME ZONE的核心逻辑容易搞混:当你传入一个不带时区的datetime值时,它会把这个值当成目标时区的本地时间,然后转换成带时区偏移的datetimeoffset。
你直接执行@timeUTC AT TIME ZONE 'Central European Standard Time',SQL会误以为2019-01-01 10:00:00是中欧时区的本地时间,对应的UTC时间其实是2019-01-01 09:00:00(因为中欧时区比UTC早1小时)。后续用CONVERT转成datetime时,自然就取了这个错误的UTC时间,所以得到了9:00。
正确的写法
你需要先把UTC时间标记为UTC时区的datetimeoffset,再转换到中欧时区,这样才能得到正确的本地时间:
DECLARE @timeUTC DATETIME = '2019-01-01 10:00:00' SELECT @timeUTC AS timeUTC, -- 第一步:将UTC时间标记为UTC时区的datetimeoffset @timeUTC AT TIME ZONE 'UTC' AS utc_with_timezone, -- 第二步:转换到中欧标准时区,得到本地时间(带时区偏移) (@timeUTC AT TIME ZONE 'UTC') AT TIME ZONE 'Central European Standard Time' AS central_european_local_time, -- 若需要不带时区的datetime类型,再做转换 CONVERT(DATETIME, (@timeUTC AT TIME ZONE 'UTC') AT TIME ZONE 'Central European Standard Time') AS central_european_local_datetime
输出结果
| timeUTC | utc_with_timezone | central_european_local_time | central_european_local_datetime |
|---|---|---|---|
| 2019-01-01 10:00:00.000 | 2019-01-01 10:00:00.000 +00:00 | 2019-01-01 11:00:00.000 +01:00 | 2019-01-01 11:00:00.000 |
关键步骤解释
@timeUTC AT TIME ZONE 'UTC':明确告诉SQL“这个datetime值是UTC时间”,生成带+00:00偏移的datetimeoffset。- 再次使用
AT TIME ZONE 'Central European Standard Time':把UTC时区的时间转换为中欧时区的本地时间,SQL会自动应用该时区的偏移规则(1月中欧标准时区为+01:00),所以10:00 UTC会转换成11:00的本地时间。 - 最后用
CONVERT转成datetime类型时,就能得到你想要的正确结果。
内容的提问来源于stack exchange,提问作者Kivayan
相关产品推荐
相关产品推荐

