Sql server 在sql server中确定远程夏令时

Sql server 在sql server中确定远程夏令时,sql-server,timezone,dst,Sql Server,Timezone,Dst,我想确定夏令时是否处于活动状态,但位于与服务器所在区域不同的区域 我的问题是我想检查伦敦的夏令时,我的服务器在加拿大;是否可以找到不同时区的夏令时?您需要部署一个DST表,并查找所需地区的DST时间。DST由各种组织发布并定期刷新。您需要了解的是,DST不能由算法确定,只能按照各个立法机构为各个地区设置的算法进行查找,并且经常更改。举个例子,这里是。维护应用程序的DST查找表是应用程序的一项定期任务。最好使用以下选项之一 但是,(根据)从SQL Server使用Microsoft时区数据库似乎很

我想确定夏令时是否处于活动状态,但位于与服务器所在区域不同的区域


我的问题是我想检查伦敦的夏令时,我的服务器在加拿大;是否可以找到不同时区的夏令时?

您需要部署一个DST表,并查找所需地区的DST时间。DST由各种组织发布并定期刷新。您需要了解的是,DST不能由算法确定,只能按照各个立法机构为各个地区设置的算法进行查找,并且经常更改。举个例子,这里是。维护应用程序的DST查找表是应用程序的一项定期任务。

最好使用以下选项之一

但是,(根据)从SQL Server使用Microsoft时区数据库似乎很困难,因为
TimeZoneInfo
类被标记为
[HostProtection]
属性,且
MayLeakOnAbort
设置为true

我相信一个可能的解决方案是使用类。应该可以从SQL CLR访问这些数据库,并提供对这两个数据库的访问

我会尝试一下,完成后在这里更新

更新

在与SQLCLR的安全限制作斗争之后,我得出结论,这种方法目前也不可能


我目前的建议是在数据库之外的应用程序逻辑中进行时区转换。

这里是一个用于SQL Server的原始IsDST

CAST((DATEPART(month, DATEADD(week, -1, <DateTime>)) + 2) % 13 / 5 AS bit) AS IsDST 将((日期部分(月,日期添加(周,-1,)+2)%13/5作为位)转换为IsDST 标准时间11月8日至3月7日的收益率为0,夏时制3月8日至11月7日的收益率为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

请参阅副本(无答案):。简单的回答是没有任何内在的东西。Windows使用存储在注册表中的“查找表”处理DST,这些表通常不能从T-SQL访问。@RichardTheKiwi-注册表中的这些数据是Microsoft时区数据库,可以通过.Net
TimeZoneInfo
类访问,该类可通过SQL CLR调用在SQL Server中使用。我将很快发布一个带有代码示例的答案。@RichardTheKiwi-我想这并不像我想的那么容易。这是正确的数据来源,但也存在一些问题。看,更大的问题是,您真的必须在SQL中这样做吗?在应用程序代码中这样做要容易得多。在数据库中部署时区数据表通常不是一个好主意。它最终将成为一个你必须手动维护的工件,随着时间的推移,你会发现它是不准确的recommendation@RemusRusanu您知道我们在哪里可以获得特定年份(如2015年)的DST SQL脚本吗?任意更改的内容需要维护。这只是谁来保养的问题。如果你能找到一个可靠的来源,我发现定期导入它是最低的维护选项,而不是实时查询外部来源。这和邮政编码数据并没有什么区别。这可能(今年?)对加拿大有效,但DST将于2015年3月29日在伦敦开始。我不知道为什么投票会被否决。OP没有要求知道任意时间的DST——这是无法提供的。也许数据源不可靠????很高兴知道。从表面上看,这个解决方案是可行的。