如何从时区名称中获取时区偏移量
Posted
技术标签:
【中文标题】如何从时区名称中获取时区偏移量【英文标题】:How to get timezone offset from the timezone name 【发布时间】:2021-04-11 22:47:01 【问题描述】:我在 SQL Server 数据库中保存了一个时区名称,例如 America/Vancouver
。
我想从 SQL 中的时区名称中获取 UTC 偏移量,例如 America/Vancouver
有 -08:00
偏移量。那么如何在 SQL 中编写查询呢?
非常感谢您的帮助
【问题讨论】:
UTC 偏移量在什么时刻?美国/温哥华在 UTC-7 和 UTC-8 之间变化。这是一个相对简单的情况,因为据我所知,它永远具有相同的 标准 时间......但是例如,继续“永久夏令时”的时区呢? (这就是未来几年欧盟很多国家可能会做的事情......所以欧洲/巴黎目前在 UTC+1 和 UTC+2 之间变化,但未来可能会永久为 UTC+2。) @JonSkeet 我需要你提到的夏令时偏移量,基本上,我在 SQL 表中有一个用户可用时间为 12:00 到 04:00,用户时区在America/Vancouver
所以我必须检查工作 UTC 时间和工作人员的可用时间,所以我需要将 UTC 时间转换为工作人员时区并比较时隙
当您说“工作 UTC 时间”时 - 您已经将其作为特定值了吗?所以问题实际上是“如何使用 IANA 时区 ID 将特定时刻转换为时区?” (最好编辑问题以明确这一点。)我不知道 SQL Server 是否 any 直接支持 IANA 时区 - 您可能需要从 IANA 时区 ID 转换首先进入 Windows 时区 ID,此时您可以使用“AT TIME ZONE”。
您已标记 SQL Server 2005 和 21008 - 您使用的是哪个?
【参考方案1】:
将 DATEPART 与 TZ 参数一起使用。示例:
SELECT DATEPART(tz, (CAST('2021-01-01' AS DATETIMEOFFSET) AT TIME ZONE 'Central European Standard Time'));
结果以分钟为单位。
【讨论】:
【参考方案2】:不幸的是,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'
上面将为您提供给定时区的当前日期、时间和偏移量,您可以将其用作查询用户可用性的基础(在问题 cmets 中提到)。
请注意,根据夏令时是否生效,偏移调整会有所不同。尽管 Windows 标识符中有“标准”一词,但在适用的情况下确实考虑了 DST。
或者,如果由于某种原因您必须完全在 SQL Server 中执行此操作而不转换到 Windows 时区,那么您将需要依赖诸如我的 SqlServerTimeZoneSupport 项目之类的项目。那个有点旧,维护得也不是很好,所以如果你能提供帮助,我建议不要使用这种方法。
【讨论】:
以上是关于如何从时区名称中获取时区偏移量的主要内容,如果未能解决你的问题,请参考以下文章