2013-04-26 42 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