2008-10-07 49 views
5

我的數據庫應用程序將部署在不同時區的多個站點上。確定T-SQL中的時區偏移

我需要一個T-SQL函數來確定YTD計算當年1月1日午夜的UTC時間戳。所有數據都以UTC時間戳存儲。

例如,芝加哥是夏令時(DST)的UTC-6,如果2008年芝加哥任何時候運行,該功能需要返回'2008-01-01 06:00:00'。如果明年在紐約(GMT-5 + DST)運行,則需要返回'2009-01-01 05:00:00'。

我可以從YEAR(GETDATE())獲取當前年份。我認爲我可以在GETDATE()和GETUTCDATE()之間做一個DATEDIFF來確定偏移量,但結果取決於查詢是否在DST期間運行。我不知道任何內置的T-SQL函數用於確定偏移量還是當前時間是否爲DST?

有沒有人有解決這個問題的T-SQL?我可以硬編碼或將它存儲在一個表中,但不希望。我想這是在SQL Server 2005中使用CLR集成的完美情況。我只是想知道是否有我不知道的T-SQL解決方案?

回答

2

看看這個以前的問題和答案相關信息:

Effectively Converting dates between UTC and Local (ie. PST) time in SQL 2005

(。總之,你需要建立在SQL Server 2005時區和DST表在SQL Server的下一個版本,我們得到一些幫助時區)

+0

謝謝埃裏克。我已經實施了一種基於表格的解決方案,就像您以前所建議的那樣。我只是想知道是否有什麼我錯過了會讓我的生活更輕鬆。 – 2008-10-09 22:07:51

0

嗯,我想我不理解問題。如果數據庫應用程序已經存儲了所有交易的UTC時間戳 - 而且您想總結自今年第一個「當地時間」以來的一些數值,那麼您的情況必須是這樣的:

(時間戳+ (GETUTCDATE() - GETDATE()))> CAST('01/01/2008' 作爲日期時間)

的DST可以關閉根據當年度的查詢運行 - 但getdate()將它考慮在內,所以您必須每次動態計算偏移量。

我......想...... :-)

+0

抵消將相對於當前日期,而不是未來的任意日期。此外,它將相對於服務器的時區,而不是客戶端的時區。 – neonski 2008-10-07 22:31:15

0

除非我記錯了,在GETUTCDATE()函數使用服務器上定義的時區 - 它對於客戶端的時區沒有信息(或任何時區)。我不認爲這些信息存儲在SQL Server 2005的任何地方,這使得它無法計算這些信息。

也許你可以從Oracle's time zone file'借用'數據並建立自己的SQL Server功能?

題外話(可能是別人有用的),但如果你使用的是Oracle,你可以使用「AT TIME ZONE」的FROM_TZ功能:

FROM_TZ(YOUR_TIMESTAMP, 'UTC') AT TIME ZONE 'America/Dawson_Creek'