2016-11-02 44 views
1

我試圖在當地時間顯示日期時間值。默認情況下,Azure SQL數據庫以UTC存儲日期和時間,但沒有辦法解決此問題。 (從內部SQL Server遷移時,這是一件痛苦的事。)我想在中歐時間顯示存儲的時間值。Azure SQL顯示當地時間

現在當地時間是11:30(CET)。 UTC時間是10:30。

DECLARE @TestTime DATETIME; 
SET @TestTime = '2016-11-02 10:30:00' 

SELECT @TestTime 
--Returns 2016-11-02 10:30:00 
SELECT @TestTime AT TIME ZONE 'Central European Standard Time' 
--Returns 02 November 2016 10:30:00 +01:00 

我需要返回2016-11-02 11:30:00莫名其妙。現在最有趣的部分:

如已提出here

SELECT convert(DATETIME,@TestTime AT TIME ZONE 'Central European Standard Time',1) 
--Returns 2016-11-02 09:30:00 So instead of adding the timezonedifference it subtracts it. 

這工作,但讓我感到噁心:

SELECT DATEADD(MINUTE,DATEPART(tz,@TestTime AT TIME ZONE 'Central European Standard Time'),@TestTime) 
--Returns 2016-11-02 11:30:00 

類似的解決方案已經表明here,但它起着字符串操作。我懷疑AT TIME ZONE有什麼問題;它應該顯示11:30 + 1,而不是10:30 + 1,否?

在當地時間真的沒有合適的方式顯示UTC時間嗎?這種「黑客入侵」感覺非常骯髒,特別是因爲在任何時候它可能會停止工作(例如,微軟修復/引入了一個錯誤)。

謝謝!

+0

你想在最後顯示本地日期時間? –

+0

@drediske在[CET](https://www.timeanddate.com/time/zones/cet)中。我想在例子中看到的是11點30分。 (其實我的數據庫有來自其他幾個時區的用戶,並且夏令時也起作用,所以它更復雜一點。)歸結爲能夠將存儲的UTC時間值轉換爲所需的本地時間。 – vacip

+0

我喜歡這些沒有評論的-1s ......如果選民啓發了我,我很想改善這個問題。 – vacip

回答

3

AT TIME ZONE語句執行不同的操作:

  1. 斷言一個datetime(或datetime2)是在特定的時間區,從而查找正確的該區域的偏移並返回一個datetimeoffset值與正確的偏移量應用。

  2. 轉換一個datetimeoffset值到不同的時區,使用從源頭值拖住時間的精確點偏移,然後找了新的要求時區偏移量和應用它。這會返回一個datetimeoffset,其潛在的時間和偏移量可能與原始時間不同,但代表相同的時間點。

您僅使用第一部分。要將UTC的datetime轉換爲特定的時區,您需要使用這兩個

SELECT @TestTime AT TIME ZONE 'UTC' AT TIME ZONE 'Central European Standard Time' 

第一AT TIME ZONE斷言,輸入datetime是UTC,導致datetimeoffset具有+00:00用於偏移。第二個AT TIME ZONE將其轉換爲請求的時區。

+1

另外,我注意到您的個人資料顯示您在布達佩斯,所以使用「中歐標準時間」區域會更準確。雖然在這種情況下,除了ID中的「an」外沒有任何區別。參考[這個映射](http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml)。 –

+0

哇,謝謝!這有點奇怪,但實際上對你的解釋有意義。再次感謝「中歐標準時間」,我鞠躬致意。 :) – vacip