2016-11-02 3 views
1

Ich arbeite an Datenzen und ich habe eine Spalte (2015, 2016, 2013, ...) und ein Viertel (1 oder 2 oder 3 oder 4) Spalte. Ich möchte sie in eine neue Spalte des Datentyps datetime konvertieren. Ich habe ein wenig gesucht und ich fand eine andere SO Frage here.Konvertieren Jahr (Aaaa) und Quartal (1 bis 4) zu Datetime in SQL Server

Die Antwort auf dieser Seite war:

Select 
    dateadd(day, -1, dateadd(year, @year - 1900, dateadd(quarter, @qq, 0))) 

Ich denke, es ist die Lösung, aber ich habe Schwierigkeiten es zu verstehen, und ich will nicht (wenn möglich) Variablen verwenden, sondern nur umwandeln in die Abfrage.

+1

Also, in Ihrem Ort, zu welcher Zeit ändert sich das Quartal, ist es jedes Jahr dasselbe? Ist es dasselbe wie TSQLs Interpretation eines Quartals? – Jodrell

Antwort

4

In SQL Server 2012+, würden Sie datefromparts() verwenden Sie den ersten Tag des Quartals zu erhalten:

select datefromparts(YearColumn, QuarterColumn * 3 - 2, 1) 

Der seltsame dateadd() Ausdruck verwendet wird, um den ersten Tag des Jahres zu erhalten.

+0

ich mag die Einfachheit von * 3 -2 dafür. Ich habe die Spaltennamen entsprechend dieser Frage bearbeitet. – pancho018

+1

Wirklich danke für die Antwort. Ich werde es bald versuchen. Ich benutze Server 2012, also ist es perfekt für mich. – kokou

0

Warum nicht einfach?

SELECT DATEADD(q, @qq - 1, DATEFROMPARTS(@year, 1, 1)) 
+0

Hallo Jodrell, ich werde das auch versuchen. danke – kokou

0

Die Antwort auf die andere Frage ist ein bisschen ein Hack, um Probleme mit verschiedenen Datumsformaten in verschiedenen Datenbanken zu verhindern. Grundsätzlich, wenn wir alles als ein Datum behandeln, müssen wir uns keine Gedanken über die verschiedenen Möglichkeiten machen, ein Datum zu formatieren.

Hier ist eine Aufschlüsselung, wie die andere Antwort funktioniert:

dateadd(quarter, @qq, 0) 

Es erstellt zunächst ein Datum aus der Basis des Quartals 0 als Datum Basis. Dies erzeugt einen von 4 Werten: 1/1/1900, 4/1/1900, 7/1/1900 und 10/1/1900 (dies ändert sich wahrscheinlich basierend auf der Lokalität des Servers, ich benutze US) .

dateadd(year, @year-1900, [date from the quarter dateadd function] 

Der zweite Teil das Datum aus dem ersten Teil nimmt, legt fest, wie viele Jahre seit 1900 vergangen sind, und fügt hinzu, dass viele Jahre zum ersten Termin. Wenn das Jahr, das verwendet wird, 2016 ist, werden 116 Jahre hinzugefügt. Dies ergibt einen der folgenden 4 Werte: 01.01.2016, 01.04.2016, 01.07.2016, 01.10.2016 (wieder US-Standort).

dateadd(day, -1, [date from previous function] 

Der letzte Teil ist der erste Tag von jedem Quartal und wandelt es in den letzten Tag eines jeden Quartals. Dies ist möglicherweise kein notwendiger Teil der Antwort für Sie.

Wie @Gordon Linoff antwortete, ist ein sauberer Ansatz die Funktion datefromparts, die nur in SQL Server 2012+ verfügbar ist.

+1

DForck42, deine Erklärung hilft mir sehr, viel mehr darüber zu verstehen. Danke, dass du dir Zeit nimmst und es erklärst. – kokou

Verwandte Themen