Sql-Server

為什麼 GetDate AND GETDATE() AT TIME ZONE ‘GMT Standard Time’ 返回錯誤的時間?

  • October 4, 2021

請看下面的程式碼:

DECLARE @UKDateTime as DateTime
SELECT @UKDateTime = GETDATE() AT TIME ZONE 'GMT Standard Time' 
print @UKDateTime 
PRINT GETDATE()

這將返回:

Oct  4 2021  4:03PM
Oct  4 2021  4:03PM

目前英國的時間是:下午 5:03(由我的電腦時鐘確認)。它似乎正在返回 UTC 日期。問題是什麼?

我將 SQL Server 設置為 Docker 容器。它是 SQL Server v18.4。

AT TIME ZONE的文件說:

將 inputdate 轉換為目標時區中相應的 datetimeoffset 值。當 inputdate 沒有提供偏移資訊時,該函式應用時區的偏移量,假設 inputdate 在目標時區。如果 inputdate 作為 datetimeoffset 值提供,則 AT TIME ZONE 子句使用時區轉換規則將其轉換為目標時區。

您正在使用 GETDATE,它返回沒有任何偏移資訊的日期時間,因此該函式假定它已經是目標時區中的時間。

如果要將本地伺服器日期和時間轉換為 GMT,可以使用:

SELECT SYSDATETIMEOFFSET() AT TIME ZONE 'GMT Standard Time';

或者,例如,如果您的本地伺服器時區是“東部標準時間”:

SELECT GETUTCDATE()                      -- datetime without context
   AT TIME ZONE 'Eastern Standard Time' -- where you are
   AT TIME ZONE 'GMT Standard Time';    -- target time zone

引用自:https://dba.stackexchange.com/questions/300593