我有每小時傳入數據(跨越5年),並且在CST或EST中記錄了時間戳。我想以UTC時間將它存儲在我的數據庫中。TimeZone使用TSQL進行轉換
有沒有辦法讓我使用TSQL從CST/CDT/CPT或EST/EDT/EPT轉換爲UTC?
我有每小時傳入數據(跨越5年),並且在CST或EST中記錄了時間戳。我想以UTC時間將它存儲在我的數據庫中。TimeZone使用TSQL進行轉換
有沒有辦法讓我使用TSQL從CST/CDT/CPT或EST/EDT/EPT轉換爲UTC?
可以確定爲datetime在行EST或EDT:
然後申請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
的mI建議您存儲這些爲DATETIMEOFFSET保存時區信息。
如果你需要顯示的那麼作爲UTC日期,那麼你可以使用SWITCHOFFSET
當然,這需要能夠計算每小時數據的偏移量, 5年的過程會有所不同。 [此MSDN博客條目](http://blogs.msdn.com/b/sqlprogrammability/archive/2008/03/18/using-time-zone-data-in-sql-server-2008.aspx)有一個草圖準確(如果複雜)的解決方案。 – ig0774
爲什麼呢?當然,你可以將它存儲爲datetimeoffset,並且使用它的偏移量,然後使用SELECT SWITCHOFFSET(mydatetimeoffsetcolumn,'00:00')AS myUTCD將UTC的日期輸出 –
我假設時間戳沒有抵消。如果他們有抵消,這是沒有問題的。 – ig0774
的差異GETUTCDATE()'和'GETDATE()之間''只爲確定在查詢運行的瞬間偏移量是有用的。這對歷史數據沒有太大的幫助,因爲偏移可以根據當地政府的心血來潮,DST等而變化。 – ig0774