Wie funktioniert Datumsberechnung in SQL Server?

7

Ich sehe oft Abfragen, die mit DATEADDund DATEDIFFin der WHEREKlausel geschrieben wurden, um einen Bereich zu definieren, die Datumszeit auf 0 Stunden zu reduzieren oder den letzten Tag eines Monats oder Jahres zu finden, aber ich verstehe nicht, wie alle Teile funktionieren.

Hier werden beispielsweise Daten vom Beginn des aktuellen Tages bis zum Beginn des Tages vor 30 Tagen gefunden.

SELECT *
FROM tbl
WHERE datecol >= DATEADD(DAY, DATEDIFF(DAY, 0, GETUTCDATE()), 0)
AND datecol   <  DATEADD(DAY, DATEDIFF(DAY, 0, GETUTCDATE()), -30);

Was leisten all die verschiedenen Teile davon?

Erik Darling
quelle

Antworten:

11

Der beste Weg, um zu verstehen, wie Datumsmathematik funktioniert, besteht darin, eine Abfrage in ihre Teile zu zerlegen.

Beginnen Sie damit:

SELECT GETUTCDATE() AS utc_date

An diesem Tag kehrt es zurück 2017-10-04 19:34:20.050.

In der Datumsberechnung sind die Zahl 0 und das Datum 1900-01-01 austauschbar.

   SELECT DATEDIFF(DAY, 0, GETUTCDATE()) AS [what does zero mean?],
          DATEDIFF(DAY, '19000101', GETUTCDATE()) AS [it means 1900-01-01]

Das bedeutet, dass Sie fast jede Zahl in ein Datum umwandeln können. Auch negative Zahlen.

   SELECT CONVERT(DATETIME, -1) AS [how is -1 a date?]

Dies wird zurückbringen 1899-12-31 00:00:00.000, was dasselbe ist wie das Folgende:

SELECT DATEADD(DAY, -1, '19000101') AS [zero minus 1 days]

Nur einen Tag vom 1900-01-01 abziehen. Verrückt oder?

Wie hilft uns das?

Schauen wir uns unsere ursprüngliche Abfrage an:

SELECT DATEDIFF(DAY, 0, GETUTCDATE())

Das gibt uns die Anzahl der Tage zwischen 1900-01-01und dem aktuellen Datum. Was bedeutet den vollen Ausdruck:

SELECT DATEADD(DAY, DATEDIFF(DAY, 0, GETUTCDATE()), 0)

Ist das Hinzufügen der Anzahl der Tage zwischen 1900-01-01und aktuell zu 1900-01-01. Damit beginnt der aktuelle Tag mit 0 Stunden.

Der zweite Teil macht dasselbe, außer dass 30 Tage von 1900-01-010 Stunden abgezogen werden.

DATEADD(DAY, DATEDIFF(DAY, 0, GETUTCDATE()), -30);

Wenn das alles zu viel ist, um sich daran zu erinnern, verstehe ich es vollkommen.

Ein Spickzettel mit wichtigen Datumsberechnungen finden Sie im Artikel von Tim Ford .

Eine Kalendertabelle mit wichtigen Daten finden Sie im Artikel von Aaron Bertrand .

Erik Darling
quelle