如何从时区名称获取时区偏移量

问题描述

我在 sql Server 数据库中保存了一个时区名称,例如 America/Vancouver。 我想从 sql 中的时区名称获取 UTC 偏移量,例如 America/Vancouver 具有 -08:00 偏移量。那么如何在 sql 中编写查询呢? 非常感谢您的帮助

解决方法

将 DATEPART 与 TZ 参数一起使用。示例:

SELECT DATEPART(tz,(CAST('2021-01-01' AS DATETIMEOFFSET) AT TIME ZONE 'Central European Standard Time')); 

结果在几分钟内。

,

遗憾的是,SQL Server 尚不直接支持 IANA 时区标识符(如 America/Vancouver)。目前,最好的选择是将 IANA 标识符转换为应用层中相应的 Windows 时区标识符,并将其存储在 SQL Server 中。

例如,如果您在应用层中运行 .NET,则可以使用我的 TimeZoneConverter 项目:

string tz = TZConvert.IanaToWindows("America/Vancouver");
// Result:  "Pacific Standard Time"

然后您可以在 SQL Server 代码中使用 AT TIME ZONE 函数:

SELECT sysdatetimeoffset() AT TIME ZONE 'Pacific Standard Time'

以上将为您提供给定时区的当前日期、时间和偏移量,您可以将其用作查询用户可用性的基础(在问题评论中提到)。

请记住,根据夏令时是否生效,偏移调整会有所不同。尽管 Windows 标识符中有“标准”一词,但确实会在适用的情况下考虑 DST。

或者,如果出于某种原因您必须完全在 SQL Server 中执行此操作而不转换为 Windows 时区,那么您将需要依赖诸如我的 SqlServerTimeZoneSupport 项目之类的项目。那个有点旧而且维护得不好,所以如果你能帮忙的话,我建议不要使用这种方法。