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

问题描述 投票:0回答:3

我有一个时区名称,如

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

sql-server sql-server-2008 sql-server-2005 timezone timezone-offset
3个回答
5
投票

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

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

结果只需几分钟。


4
投票

不幸的是,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 项目。 那个有点旧而且维护得不太好,所以如果你可以的话,我建议不要采用这种方法。


0
投票

在尝试了来自数十个来源的一系列不同方法之后,我偶然发现了 Tobias J 提供的以下解决方案。

“从 .NET 6 开始,终于可以跨平台方式处理时区,因此不再需要这些手动解决方法。

TimeZoneInfo.FindSystemTimeZoneById(string) 方法自动接受任一平台上的 Windows 或 IANA 时区,并根据需要进行转换。”

以下是 Tobias 原始解决方案的链接。 如何在 Windows 和 IANA 时区之间进行转换?

© www.soinside.com 2019 - 2024. All rights reserved.