【问题标题】: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 - 您使用的是哪个?

标签: sql-server sql-server-2008 sql-server-2005 timezone timezone-offset


【解决方案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 项目之类的项目。那个有点旧,维护得也不是很好,所以如果你能提供帮助,我建议不要使用这种方法。

    【讨论】:

      猜你喜欢
      • 2020-04-20
      • 2016-08-06
      • 1970-01-01
      • 2016-05-07
      • 2014-02-15
      • 2011-02-28
      • 1970-01-01
      • 2020-01-02
      • 2011-07-29
      相关资源
      最近更新 更多