![](/img/trans.png)
[英]How to create Daylight Savings time Start and End function in 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.