【问题标题】:Daylight savings time in Sql ServerSql Server 中的夏令时
【发布时间】:2010-10-22 06:08:15
【问题描述】:

我们正在使用一个以 C/Unix 格式存储日期的旧应用程序。 C 时间基本上是自 1970 年 1 月 1 日以来的秒数。日期以整数形式存储在 SQL Server 数据库中。我正在为使用这些日期的报告编写视图。

到目前为止,我正在从 UNIX 时间转换为本机日期时间:

DateAdd(s,3600+unix_time,'1/1/1970')

3600 用于从 UTC 转换为我们当地的 GMT+1 时区。这在冬天是准确的,但在夏天,由于夏令时,它会休息一小时。

SQL Server 中是否有内置方法可以将 UTC 转换为本地时间?

【问题讨论】:

    标签: sql sql-server time


    【解决方案1】:

    实际上,上面的答案忽略了夏令时。如果当前不是夏令时,则夏令时内的日期将关闭一小时,反之亦然。此外,许多不同国家/地区的立法者都喜欢让夏令时变得比需要的更复杂。

    基本上,尽可能在 SQL Server 中避免这种情况。客户端日期处理库通常可以正确处理。如果您需要使用数据库中已有的时间戳,请考虑将它们转换为日期时间列或将日期值转换为客户端代码中的时间戳,然后再将它们用作查询参数。

    这只是那些一直以错误方式发明的轮子之一。

    【讨论】:

      【解决方案2】:

      我在使用 UTC/GMT1 时遇到了类似的问题,尽管在数据库中您希望避免这种情况的许多陈述都是非常真实且有价值的建议,但并非总是可以完全避免这种情况。

      但是,当您使用 GMT1 时,您很幸运,因为夏令时实际上是基于算法的。 (不像我理解的美国夏令时是由立法机构决定的。)

      由此,我能够制作将 UTC 日期时间输入转换为 GMT1 日期时间的存储过程。希望这会有所帮助;)

      CREATE PROCEDURE spUTCGMT1 @date AS DATETIME
      AS 
      BEGIN
           DECLARE @year AS INT = DATEPART( YYYY,@date)
           DECLARE @f AS INT = (FlOOR( (5 * @year) / 4) - FLOOR( @year / 100)+ FLOOR( @year / 400)) % 7
      
           IF(@date BETWEEN 
              DATEADD( DD,- ((@f + 5) % 7),(CAST(@year AS CHAR(4)) + '-03-31')) AND 
              DATEADD( DD,- ((@f + 2) % 7),(CAST(@year AS CHAR(4)) + '-10-31')))
           SELECT 
                  DATEADD( HH,2,@date)
           ELSE
           SELECT 
                  DATEADD( HH,1,@date)
      END
      

      【讨论】:

        【解决方案3】:

        您需要使用 DateDiff(s, getutcdate(), getdate())+unix_time 而不是 3600,这将为您提供与 UTC 时间的正确偏移量。

        干杯,
        埃里克

        【讨论】:

        • 谢谢!必须更改顺序(首先是 getdateutc()),但之后它就可以正常工作了。
        • 太棒了。我在帖子中修复了代码。在我的时区获得语法对我来说还为时过早:)
        • 这不适用于遵守夏令时的地区。
        • 我不明白这怎么可能是正确的答案。它将通过 current 时区偏移量调整时间 - 因此,如果在冬季运行,它可能会将所有时间调整一小时,但在夏季运行时,它将所有时间调整两个小时(或无论您的特定偏移量是什么)。它不会考虑存储的时间。
        猜你喜欢
        • 2012-02-12
        • 2012-11-07
        • 2013-04-20
        • 2015-04-23
        • 2015-08-14
        • 1970-01-01
        • 2011-03-13
        • 1970-01-01
        相关资源
        最近更新 更多