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

3

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


3
什么时间点UTC偏移?美国/温哥华的偏移值在UTC-7和UTC-8之间变化。就我所知,这是一个相对简单的情况,因为它一直保持着同样的标准时间......但是像那些实行“永久夏令时”的时区呢?(未来欧盟可能会采取这种方式...因此,目前欧洲/巴黎的偏移值在UTC+1和UTC+2之间变化,但将来可能永久为UTC+2。) - Jon Skeet
@JonSkeet,我需要你提到的夏令时偏移量。基本上,我在SQL表中有一个用户的可用时间为12:00至04:00,并且用户的时区是America/Vancouver。因此,我需要将工作的UTC时间转换为工作者的时区,并与可用时间段进行比较。 - Haresh Makwana
1
当你说“工作的UTC时间”- 你已经有一个具体的值了吗?所以问题实际上是“如何将特定的时间点转换为使用IANA时区ID的时区?”(最好编辑问题,使其清晰明确。)我不知道SQL Server是否直接支持IANA时区 - 你可能需要先将IANA时区ID转换为Windows时区ID,然后再使用“AT TIME ZONE”。 - Jon Skeet
你标记了SQL Server 2005和21008 - 你使用的是哪个版本? - Dale K
2个回答

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 项目等项目。那个项目有点旧且维护不太好,如果可以,请避免使用该方法。


1
只是一个小精度...AT TIME ZONE 不是一个函数,而是一个操作符(在数学术语中...)就像 BETWEEN、LIKE 或 IN 一样...而 SQL 是关系代数的解释! - SQLpro

4
使用带有TZ参数的DATEPART。例如:
SELECT DATEPART(tz, (CAST('2021-01-01' AS DATETIMEOFFSET) AT TIME ZONE 'Central European Standard Time')); 

结果以分钟为单位。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接