2012-04-20 28 views
3

我正在移植現有應用程序以在Windows Azure上運行。我們當前的解決方案嚴重依賴Windows在SQL Server上設置的時區。我們在我們的存儲過程和視圖中使用GETDATE()的頻率很高。問題在於SQL Azure使用UTC時區運行。我試圖用一個方法調用替換GETDATE()方法調用,該方法調用將根據數據庫中的時區應該是什麼設置來獲取時間。我遇到的問題是夏令時。有沒有人用SQL編寫過一個方法,可以返回當前的日期/時間並正確調整DST?SQL Server中特定時區的本地時間

我猜我會得到一些答案,會說我應該全面使用UTC時間。由於我不想解釋的原因,這似乎不是一種選擇。

任何幫助/建議,你可以給我將不勝感激。謝謝。

+0

你是對的,你應該使用UTC。轉換到DST是後方的痛苦,並且記住幾年前DST進入和退出的規則發生了變化。你可以寫一個udf做轉換,但這將是一個昂貴的操作。 – 2012-04-20 20:28:21

+0

DST是相當痛苦的。在以前的生活中,我使用了日曆表,因爲用戶有不同的時區偏好,不同的時區可能會受到DST的影響,也可能不會受到DST的影響,並且肯定遵循不同的時間表。因此,用戶將其時區指定爲首選項,當他們從現在開始計劃了6個月的事件時,我們根據日曆表中的查找存儲了UTC時間 - 我們匹配日期和時區,因此知道如何抵消。 – 2012-04-20 20:42:40

+2

它會*很高興聽到你想使用當地時間的理由。 *有*我知道的一些,但它們相對較少。看看相關的SO問題和http://blogs.msdn.com/b/sqlprogrammability/archive/2008/03/18/using-time-zone-data-in-sql-server-2008.aspx我懷疑你是不會發現這是一件容易的事。它確實需要在T-SQL本身內嗎?您無法將該值作爲參數傳遞給您的存儲過程? – 2012-04-20 20:43:15

回答

1

我們已經決定更新列問題是DateTimeOffset而不是DateTime

感謝所有回覆的人。

0

我不知道這是否會幫助你。但是這會在SERVER註冊表上執行註冊表讀取。在本地環境中,您可以確定SERVER時區和GMT之間的差異,並從中確定所需的計算結果。一個有用的小技巧,我從其他論壇帖子(信貸在那裏)拾起。

Use Master 
Go 



DECLARE @ZONEDIFF INT 

EXECUTE dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\TimeZoneInformation','ActiveTimeBias', @ZONEDIFF OUT 

SELECT getdate() AS MyTime, dateadd(minute, @ZONEDIFF, getdate()) as SERVERZONE 

讓我知道是否有幫助,或者如果我沒有正確理解你。

的Mac

+0

如果你只關心當前的時區差異,爲什麼不只是'SELECT DATEDIFF(MINUTE,GETDATE(),GETUTCDATE());',而不是麻煩XP和註冊表?我懷疑問題比這個更復雜 - 而且你需要知道特定日期的三角洲,而不僅僅是現在。 – 2012-04-22 20:02:58

+0

對不起,這不是我正在尋找的。我對我們的數據庫中設置的時區(在客戶端表中)更感興趣。 – Bryan 2012-04-23 13:41:52