2009-04-28 164 views
2

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

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

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

3600是从UTC转换为当地GMT + 1个时区。这在冬季是准确的,但在夏季,由于夏令时只有一个小时。

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

回答

-1

而不是3600,你会想做DateDiff(s,getutcdate(),getdate())+ unix_time,它会给你正确的UTC时间偏移量。

干杯,
埃里克

+0

谢谢!必须改变顺序(getdateutc()第一次),但之后,它工作正常。 – Andomar 2009-04-28 11:56:04

6

其实,答案上述忽略夏令时。如果目前不是夏令时,则夏令时期内的日期为一小时,反之亦然。而且,许多不同国家的立法者都喜欢使日光节约得更加复杂。

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

这只是一个不断发明错误方式的车轮之一。

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