我有一个时区名称,如
America/Vancouver
保存在 SQL Server 数据库中。
我想从 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"
AT TIME ZONE
函数:
SELECT sysdatetimeoffset() AT TIME ZONE 'Pacific Standard Time'
上面将为您提供当前日期、时间和给定时区的偏移量,您可以将其用作查询用户可用性的基础(在问题评论中提到)。
请记住,根据夏令时是否有效,偏移调整会有所不同。 尽管 Windows 标识符中有“标准”一词,但在适用的情况下确实会考虑 DST。
或者,如果由于某种原因您必须完全在 SQL Server 中执行此操作而不转换为 Windows 时区,那么您将需要依赖项目,例如我的 SqlServerTimeZoneSupport 项目。 那个有点旧而且维护得不太好,所以如果你可以的话,我建议不要采用这种方法。
在尝试了来自数十个来源的一系列不同方法之后,我偶然发现了 Tobias J 提供的以下解决方案。
“从 .NET 6 开始,终于可以跨平台方式处理时区,因此不再需要这些手动解决方法。
TimeZoneInfo.FindSystemTimeZoneById(string) 方法自动接受任一平台上的 Windows 或 IANA 时区,并根据需要进行转换。”
以下是 Tobias 原始解决方案的链接。 如何在 Windows 和 IANA 时区之间进行转换?