2009-04-28 4 views
2

Wir verwenden eine alte Anwendung, die Daten im C/Unix-Format speichert. Die C-Zeit ist im Grunde die Anzahl der Sekunden seit dem 1. Januar 1970. Die Daten werden als Ganzzahl in einer SQL Server-Datenbank gespeichert. Ich schreibe eine Ansicht für einen Bericht, der diese Daten verwendet.Sommerzeit in Sql Server

Bisher bin ich auf ein natives Datetime aus der UNIX-Zeit Konvertierung mit:

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

Die 3600 ist von der UTC unserer lokalen GMT + 1 Zeitzone zu konvertieren. Dies ist im Winter genau, aber im Sommer ist es wegen der Sommerzeit eine Stunde frei.

Gibt es eine integrierte Möglichkeit, in SQL Server von UTC in lokale Zeit zu konvertieren?

Antwort

-1

Statt 3600 sollten Sie DateDiff (s, getutcdate(), getdate()) + unix_time verwenden, was Ihnen den korrekten Offset von der UTC-Zeit gibt.

Cheers,
Eric

+0

Danke! Musste die Reihenfolge ändern (getdateutc() zuerst), aber danach funktioniert es gut. – Andomar

+0

Fantastisch. Ich habe den Code in meinem Beitrag korrigiert. Es ist ein bisschen zu früh für mich, Syntax hier in meiner Zeitzone zu bekommen :) – Eric

+1

Dies funktioniert nicht mit Regionen, die Sommerzeit zu beobachten. – Boog

6

Eigentlich vernachlässigt die Antwort über die Sommerzeit. Wenn es momentan keine Sommerzeit gibt, ist ein Datum innerhalb einer Sommerzeit eine Stunde und umgekehrt. Auch Gesetzgeber in vielen verschiedenen Ländern lieben es, die Sommerzeit komplizierter zu machen, als es sein muss.

Im Wesentlichen versuchen, dies in SQL Server zu vermeiden, wenn überhaupt möglich. Client-seitige Datenbehandlungsbibliotheken können es normalerweise richtig machen. Wenn Sie mit Zeitstempeln arbeiten müssen, die sich bereits in der Datenbank befinden, sollten Sie sie in datetime-Spalten konvertieren oder Datumswerte in Zeitstempel im Client-Code konvertieren, bevor Sie sie als Abfrageparameter verwenden.

Dies ist nur eines dieser Räder, das ständig falsch erfunden wird.

0

Ich hatte ein ähnliches Problem mit UTC/GMT1, und während die vielen Aussagen, dass das, was Sie in der Datenbank vermeiden wollen, sehr wahr und wertvoll Beratung sind, ist es nicht immer möglich, dies vollständig zu vermeiden.

Wenn Sie jedoch mit GMT1 arbeiten, haben Sie Glück, da die Sommerzeit dafür tatsächlich auf einem Algorithmus basiert. (Anders als US-Sommerzeit, die ich verstehe, wird von gesetzgebenden Körperschaften entschieden.)

Von diesem war ich in der Lage, diese gespeicherte Prozedur, die UTC Datetime-Eingabe in GMT1 Datetime konvertiert. Hoffe das hilft;)

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