2013-04-26 66 views
5

我想確定夏令時是否處於活動狀態,但與我的服務器所在的區域不同。確定SQL服務器中的遠程夏令時

我的問題是我想檢查倫敦夏令時,我的服務器在加拿大;是否有可能找到不同時區的夏令時?

+1

指重複(無答案):http://stackoverflow.com/questions/6781121/determine-if-daylight-saving-time-is-積極-SQL服務器。簡單的答案是沒有內置任何東西.Windows使用存儲在註冊表中的「查找表」來處理DST,這些查詢表通常無法從T-SQL訪問。 – RichardTheKiwi 2013-04-26 08:29:19

+0

@RichardTheKiwi - 此註冊表中的數據是Microsoft時區數據庫[請參閱此處](http://stackoverflow.com/tags/timezone/info),可通過.Net'TimeZoneInfo'類訪問,該類可以是通過SQL CLR調用在SQL Server中使用。我將很快發佈一個代碼示例的答案。 – 2013-04-26 16:08:42

+0

@RichardTheKiwi - 我想這不像我想的那麼容易。它是數據的正確來源,但有一些問題。請參閱http:// stackoverflow。com/q/614600/634824 – 2013-04-26 16:16:14

回答

5

您需要部署一個DST表並查找所需區域的DST時間。 DST由各個組織發佈並定期更新。您需要了解的是,DST無法通過算法確定,只能按照各地區各立法機構的規定進行查找,並且頻繁更改。例如,這裏是current 2013 DST table。維護您的應用程序的DST查找表當前將是您的應用程序的定期任務。

+0

在數據庫中部署時區數據表通常不是一個好主意。它最終會成爲您必須手動維護的工件,並且隨着時間的推移,您會發​​現它不準確。 – 2013-04-26 16:07:00

+3

我支持我的推薦 – 2013-04-27 12:33:44

+0

@RemusRusanu您知道我們可以在哪裏獲得像2015年這樣的特定年份的DST SQL腳本嗎? – sqluser 2015-07-10 04:01:59

0

最好的辦法是使用the two common Time Zone databases之一。

然而,似乎(據this question)是很難從SQL Server使用Microsoft區數據庫,因爲TimeZoneInfo類標有[HostProtection]屬性與MayLeakOnAbort設置爲true。

我相信一個可能的解決方案是使用NodaTime類代替。這些應可從SQL CLR訪問,並提供對數據庫的訪問。

我會嘗試完成後更新。

UPDATE

與SQL CLR的安全限制的戰鬥後,我斷定這是方法是目前不可能無論是。

我目前的建議是在您的應用程序邏輯中在數據庫之外進行時區轉換。

0

下面是SQL Server中的粗IsDST ...

CAST((DATEPART(month, DATEADD(week, -1, <DateTime>)) + 2) % 13/5 AS bit) AS IsDST

得0爲標準時間11月8日至三月七日,和1夏令時間3月8日日 - 11月7

+4

這對加拿大可能有效(今年?),但DST從2015年3月29日開始在倫敦。 – Paolo 2015-01-30 19:39:17

-1

上的SQL Server 2016

現在您可以使用sys.time_zone_info查詢特定時區是否當前在DST上。

select * from sys.time_zone_info 

這裏有一個例子結果

name     current_utc_offset is_currently_dst 
Aleutian Standard Time -09:00    1 
Hawaiian Standard Time -10:00    0 
Marquesas Standard Time -09:30    0 
Alaskan Standard Time -08:00    1 
+1

我不知道爲什麼這是倒票。 OP沒有要求任何時候知道DST的方法 - 這是無法提供的。也許數據源不可靠?這將是很高興知道。表面看來,解決方案看起來可行。 – bielawski 2017-06-07 15:07:36