簡體   English   中英

SQL Server中的夏令時

[英]Daylight savings time in Sql Server

我們正在使用一個舊的應用程序,該應用程序以C / Unix格式存儲日期。 C時間基本上是自1970年1月1日以來的秒數。日期以整數形式存儲在SQL Server數據庫中。 我正在為使用這些日期的報告編寫視圖。

到目前為止,我正在使用以下方法從UNIX時間轉換為本地日期時間:

DateAdd(s,3600+unix_time,'1/1/1970')

3600將從UTC轉換為我們當地的GMT + 1時區。 在冬天,這是正確的,但在夏季,由於夏令時,該時間減少了一個小時。

在SQL Server中是否有將UTC轉換為本地時間的內置方法?

實際上,以上答案忽略了夏時制。 如果當前不是夏令時,則夏令時內的日期將減少一個小時,反之亦然。 另外,許多國家/地區的立法者都喜歡使日光節約變得比需要的復雜。

本質上,如果可能的話,請嘗試在SQL Server中避免這種情況。 客戶端日期處理庫通常可以正確解決問題。 如果需要使用數據庫中已有的時間戳,請在將它們用作查詢參數之前考慮將其轉換為datetime列或將日期值轉換為客戶端代碼中的時間戳。

這只是一貫以錯誤的方式發明的輪子之一。

我在UTC / GMT1上也遇到過類似的問題,盡管您在數據庫中要避免的許多陳述是非常真實且有價值的建議,但並非總是可能完全避免這種情況。

但是,當您使用GMT1時,會很幸運,因為它的夏令時實際上是基於算法的。 (與我所了解的美國夏令時不同,立法機構決定了這一點。)

由此,我能夠完成將UTC日期時間輸入轉換為GMT1日期時間的存儲過程。 希望這可以幫助 ;)

CREATE PROCEDURE spUTCGMT1 @date AS DATETIME
AS 
BEGIN
     DECLARE @year AS INT = DATEPART( YYYY,@date)
     DECLARE @f AS INT = (FlOOR( (5 * @year) / 4) - FLOOR( @year / 100)+ FLOOR( @year / 400)) % 7

     IF(@date BETWEEN 
        DATEADD( DD,- ((@f + 5) % 7),(CAST(@year AS CHAR(4)) + '-03-31')) AND 
        DATEADD( DD,- ((@f + 2) % 7),(CAST(@year AS CHAR(4)) + '-10-31')))
     SELECT 
            DATEADD( HH,2,@date)
     ELSE
     SELECT 
            DATEADD( HH,1,@date)
END

而不是3600,您需要執行DateDiff(s,getutcdate(),getdate())+ unix_time,這將為您提供與UTC時間的正確偏移。

干杯,
埃里克

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM