Sql Server中的夏令时

时间:2009-04-28 07:57:47

标签: sql sql-server time

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

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

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

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

在SQL Server中是否有内置的从UTC转换为本地时间的方法?

3 个答案:

答案 0 :(得分:6)

实际上,上面的答案忽略了夏令时。如果目前不是夏令时,则夏令时内的日期将为一小时,反之亦然。此外,许多不同国家的立法者都喜欢使夏令时变得更加复杂。

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

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

答案 1 :(得分:0)

我在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

答案 2 :(得分:-1)

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

干杯,
埃里克