2011-07-06 35 views
1

我有每小時傳入數據(跨越5年),並且在CST或EST中記錄了時間戳。我想以UTC時間將它存儲在我的數據庫中。TimeZone使用TSQL進行轉換

有沒有辦法讓我使用TSQL從CST/CDT/CPT或EST/EDT/EPT轉換爲UTC?

回答

1

可以確定爲datetime在行EST或EDT:

Since 2007, the local time changes at 02:00 EST to 03:00 EDT on the second Sunday in March and returns at 02:00 EDT to 01:00 EST on the first Sunday in November, in the U.S. as well as in Canada

然後申請DATEADD()

MB我的源代碼更好地解釋我的意思:

declare @t table(dt datetime) 

insert @t values ('2011-07-06T10:00:00'), ('2011-01-01T00:00:00'), ('2011-03-12T00:00:00'), 
    ('2006-07-06T10:00:00') 

select b.dt 
    , CASE 
     WHEN b.dt between b.[edt_start] and [edt_end] 
      THEN DATEADD(HH, -5, b.dt) 
     ELSE DATEADD(HH, -4, b.dt) 
    END 

    , CASE 
     WHEN b.dt between b.[edt_start] and [edt_end] 
      THEN '-05:00' 
     ELSE '-04:00' 
    END 

from 
(
    select a.dt 
     , DATEADD(HH, 2, CASE 
      WHEN DATEPART(WEEKDAY, a.march) = 1 
       THEN a.march 
      ELSE DATEADD(DAY, 15 - DATEPART(WEEKDAY, a.march), a.march) 
     END) [edt_start] 

     , DATEADD(HH, 2, CASE 
      WHEN DATEPART(WEEKDAY, a.november) = 1 
       THEN a.march 
      ELSE DATEADD(DAY, 8 - DATEPART(WEEKDAY, a.november), a.november) 
     END) [edt_end] 
    from 
    (
     select t.dt 
      , YEAR(t.dt) [year] 
      , CAST(CAST(YEAR(t.dt) as varchar(4)) + '03' + '01' as datetime) [march] 
      , CAST(CAST(YEAR(t.dt) as varchar(4)) + '11' + '01' as datetime) [november] 
     from @t t 
    )a 
)b 
+0

的差異GETUTCDATE()'和'GETDATE()之間''只爲確定在查詢運行的瞬間偏移量是有用的。這對歷史數據沒有太大的幫助,因爲偏移可以根據當地政府的心血來潮,DST等而變化。 – ig0774

2

的mI建議您存儲這些爲DATETIMEOFFSET保存時區信息。

如果你需要顯示的那麼作爲UTC日期,那麼你可以使用SWITCHOFFSET

+0

當然,這需要能夠計算每小時數據的偏移量, 5年的過程會有所不同。 [此MSDN博客條目](http://blogs.msdn.com/b/sqlprogrammability/archive/2008/03/18/using-time-zone-data-in-sql-server-2008.aspx)有一個草圖準確(如果複雜)的解決方案。 – ig0774

+0

爲什麼呢?當然,你可以將它存儲爲datetimeoffset,並且使用它的偏移量,然後使用SELECT SWITCHOFFSET(mydatetimeoffsetcolumn,'00:00')AS myUTCD將UTC的日期輸出 –

+0

我假設時間戳沒有抵消。如果他們有抵消,這是沒有問題的。 – ig0774