Sql-Server

SQL Server 2012 等效於 AT TIME ZONE 功能

  • June 30, 2021

SQL Server 2012 中有沒有辦法獲取特定日期/時間的伺服器時區?在 SQL Server 2016 中,您有AT TIME ZONE,但在 2012 年不可用。我有一個datetimeoffset,我需要將其轉換為伺服器的時區(在該日期),然後再將其截斷為datetime. SWITCHOFFSET僅當您知道偏移量時才有效,但對於每年更改兩次時區的伺服器,偏移量將來回翻轉。

此查詢說明了 SQL Server 2016 中的功能:

SELECT @@SERVERNAME AS [SERVERNAME]
   , GETDATE() AT TIME ZONE 'Central Standard Time' AS [GETDATE() AT TIME ZONE 'Central Standard Time']
   , GETDATE() AT TIME ZONE 'Eastern Standard Time' AS [GETDATE() AT TIME ZONE 'Eastern Standard Time']
   , DATEADD(MONTH, -6, GETDATE()) AT TIME ZONE 'Central Standard Time' AS [DATEADD(MONTH, -6, GETDATE()) AT TIME ZONE 'Central Standard Time']
   , DATEADD(MONTH, -6, GETDATE()) AT TIME ZONE 'Eastern Standard Time' AS [DATEADD(MONTH, -6, GETDATE()) AT TIME ZONE 'Eastern Standard Time']
;

至少在 6 月,前兩列中的 tzoffset 與後兩列不同,因為“標準”時區在 12 月的偏移量與 6 月不同。

這是日曆表的一個很好的案例。

Aaron Bertrand 在這裡深入介紹了這個確切的場景。整篇文章非常深入,可以在此處複製答案,但我會嘗試總結一下。

實質上,您創建了一個日期表,並在元數據中包含您關心的所有年份的夏令時的開始/結束。然後,您可以使用這些日期將時間從您的時區轉換為 UTC,反之亦然。一旦您有了要加入的日曆表,就無需費力地確定您是處於標準時間還是夏令時間,就變得微不足道了。

在您的案例中,您可以通過偏移量簡單地轉換為 UTC,然後使用 Aaron 的日曆表方法和隨附的函式轉換回本地時間。

作為風格問題,我也非常喜歡始終將日期時間值儲存在 UTC 以進行規範數據儲存。這些時區和夏令時對話非常複雜,如果您始終以 UTC 儲存數據,則可以確保您擁有良好的數據,並且只需要與顯示錯誤作鬥爭。如果您在儲存數據方面存在錯誤,則修復需要追溯修復數據,這要復雜得多。

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