为什么 GetDate AND GETDATE() AT TIME ZONE 'GMT Standard Time' 返回错误的时间?

w00*_*977 7 sql-server timezone datetime

请看下面的代码:

DECLARE @UKDateTime as DateTime
SELECT @UKDateTime = GETDATE() AT TIME ZONE 'GMT Standard Time' 
print @UKDateTime 
PRINT GETDATE()
Run Code Online (Sandbox Code Playgroud)

这将返回:

Oct  4 2021  4:03PM
Oct  4 2021  4:03PM
Run Code Online (Sandbox Code Playgroud)

目前英国时间为:下午 5:03(由我的电脑时钟确认)。它似乎正在返回 UTC 日期。问题是什么?

我将 SQL Server 设置为 Docker 容器。它是 SQL Server v18.4。

Pau*_*ite 12

AT TIME ZONE的文档说:

\n
\n

将输入日期转换为目标时区中相应的 datetimeoffset 值。当提供的 inputdate 没有偏移量信息时,该函数将应用时区的偏移量,假设 inputdate 位于目标时区。如果 inputdate 作为 datetimeoffset 值提供,则 AT TIME ZONE 子句会使用时区转换规则将其转换为目标时区。

\n
\n

您正在使用GETDATE,它返回一个没有任何偏移信息的日期时间,因此该函数假设它已经是目标时区的时间。

\n

如果您想将本地服务器日期和时间转换为 GMT,您可以使用:

\n
SELECT SYSDATETIMEOFFSET() \n    AT TIME ZONE \'GMT Standard Time\';\n
Run Code Online (Sandbox Code Playgroud)\n

或者例如,如果您的本地服务器时区是“东部标准时间”:

\n
SELECT GETDATE()                         -- datetime without context\n    AT TIME ZONE \'Eastern Standard Time\' -- where you are\n    AT TIME ZONE \'GMT Standard Time\';    -- target time zone\n
Run Code Online (Sandbox Code Playgroud)\n

有关 的详细信息AT TIME ZONE,请参阅Rob Farley 撰写的SQL Server 2016 中最喜欢的新功能 AT TIME ZONE \xe2\x80\x93

\n