2009-04-28 165 views
2

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

到目前爲止,我是從UNIX時間轉換爲本地日期時間與:

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

3600是從UTC轉換爲當地GMT + 1個時區。這在冬季是準確的,但在夏季,由於夏令時只有一個小時。

在SQL Server中是否有一種從UTC轉換爲本地時間的內置方法?

回答

-1

而不是3600,你會想做DateDiff(s,getutcdate(),getdate())+ unix_time,它會給你正確的UTC時間偏移量。

乾杯,
埃裏克

+0

謝謝!必須改變順序(getdateutc()第一次),但之後,它工作正常。 – Andomar 2009-04-28 11:56:04

6

其實,答案上述忽略夏令時。如果目前不是夏令時,則夏令時期內的日期爲一小時,反之亦然。而且,許多不同國家的立法者都喜歡使日光節約得更加複雜。

本質上,儘可能地避免在SQL Server中出現這種情況。客戶端日期處理庫通常可以讓它正確。如果您需要使用數據庫中已有的時間戳,請考慮將它們轉換爲日期時間列或將日期值轉換爲客戶端代碼中的時間戳,然後再將它們用作查詢參數。

這只是一個不斷髮明錯誤方式的車輪之一。

0

我與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