【问题标题】:Determine Time Zone Offset in T-SQL在 T-SQL 中确定时区偏移量
【发布时间】:2010-09-15 21:21:02
【问题描述】:

我的数据库应用程序将部署在不同时区的多个站点。

我需要一个 T-SQL 函数来确定当年 1 月 1 日午夜的 UTC 时间戳以进行 YTD 计算。所有数据都存储在 UTC 时间戳中。

例如,芝加哥是 UTC-6 夏令时 (DST),如果在 2008 年的任何时间在芝加哥运行,该函数需要返回“2008-01-01 06:00:00”。如果明年在纽约(GMT-5 + DST)运行,则需要返回 '2009-01-01 05:00:00'。

我可以从YEAR(GETDATE()) 获取当前年份。我想我可以在GETDATE()GETUTCDATE() 之间做一个DATEDIFF 来确定偏移量,但结果取决于查询是否在DST 期间运行。我不知道任何用于确定偏移量或当前时间是否为 DST 的内置 T-SQL 函数?

有没有人在 T-SQL 中解决这个问题?我可以对其进行硬编码或将其存储在表格中,但不希望这样做。我想这是在 SQL Server 2005 中使用 CLR 集成的完美情况。我只是想知道是否有我不知道的 T-SQL 解决方案?

【问题讨论】:

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


    【解决方案1】:

    嗯,我想我不明白这个问题。如果数据库应用程序已经为它的所有事务存储了 UTC 时间戳,并且您想要总结自年初“本地时间”以来的一些值,那么您的条件必须类似于:

    (timestamp + (getutcdate() - getdate())) > cast('01/01/2008' as datetime)
    

    DST 可以 onoff 取决于查询运行的年份 - 但getdate() 会考虑到它,因此您必须动态计算每次的偏移量。

    【讨论】:

    • 偏移量将相对于当前日期,而不是未来的任意日期。此外,它是相对于服务器的时区,而不是客户端的。
    【解决方案2】:

    除非我弄错了,否则 GETUTCDATE() 函数使用服务器上定义的时区——它没有关于客户端时区(或任何时区)的信息。我不认为这些信息存储在 SQL Server 2005 的任何地方,这使得它无法计算这些信息。

    也许您可以“借用”Oracle's time zone file 的数据并构建您自己的 SQL Server 函数?

    离题(可能对其他人有用),但如果您使用的是 Oracle,则可以使用 FROM_TZ 函数和“AT TIME ZONE”:

    FROM_TZ(YOUR_TIMESTAMP, 'UTC') AT TIME ZONE 'America/Dawson_Creek'
    

    【讨论】:

      【解决方案3】:

      查看之前的问题和答案以获取相关信息:

      Effectively Converting dates between UTC and Local (ie. PST) time in SQL 2005

      (总而言之,您确实需要在 Sql Server 2005 中构建时区和 DST 表。在下一个版本的 Sql Server 中,我们会在时区方面获得一些帮助。)

      【讨论】:

      • 谢谢埃里克。我已经实现了一个基于表格的解决方案,就像您过去建议的那样。我只是想知道是否有什么我错过的东西可以让我的生活更轻松。
      猜你喜欢
      • 2011-08-04
      • 1970-01-01
      • 2010-11-19
      • 2012-12-08
      • 1970-01-01
      • 2015-11-25
      • 2016-11-10
      • 2010-12-23
      • 2011-09-02
      相关资源
      最近更新 更多