问题描述
我在 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 项目之类的项目。那个有点旧而且维护得不好,所以如果你能帮忙的话,我建议不要使用这种方法。