Kategorien:

Datums- und Uhrzeitfunktionen

DATEDIFF

Berechnet die Differenz zwischen zwei Datums-, Zeit- oder Zeitstempelausdrücken anhand der angeforderten Datums- oder Zeitkomponente. Die Funktion gibt das Ergebnis der Subtraktion des zweiten Arguments vom dritten Argument zurück.

Das Minuszeichen (-) kann auch zum Subtrahieren von Datumsangaben verwendet werden.

Siehe auch:

TIMEDIFF, TIMESTAMPDIFF

Syntax

Für DATEDIFF

DATEDIFF( <date_or_time_part>, <date_or_time_expr1>, <date_or_time_expr2> )

Für Minuszeichen

<date_expr2> - <date_expr1>

Argumente

Für DATEDIFF:

  • Teil_von_Datum/Uhrzeit muss einer der unter Unterstützte Datums- und Zeitabschnitte aufgeführten Werte sein (z. B. month). Der Wert kann ein Zeichenfolgenliteral oder ohne Anführungszeichen sein (z. B. 'month' oder month).

  • Datum_oder_Zeit_Ausdruck1 und Datum_oder_Zeit_Ausdruck2 müssen ein Datum, eine Uhrzeit, ein Zeitstempel oder ein Ausdruck sein, das bzw. der sich zu einem Datum, einer Uhrzeit oder einem Zeitstempel auswerten lässt. Der Wert Datum_oder_Zeit_Ausdruck1 wird von Datum_oder_Zeit_Ausdruck2 abgezogen.

Für Minuszeichen:

  • Datum_oder_Zeit_Ausdruck1 und Datum_oder_Zeit_Ausdruck2 müssen ein Datum oder ein Ausdruck sein, das bzw. der sich zu einem Datum auswerten lässt. Der Wert Datum_Ausdruck1 wird von Datum_Ausdruck2 subtrahiert.

Rückgabewerte

Für DATEDIFF:

  • Gibt eine Ganzzahl (Integer) zurück, die die Differenz zwischen Datum_oder_Zeit_Ausdruck2 und Datum_oder_Zeit_Ausdruck1 als Anzahl der Einheiten (Sekunden, Tage usw.) darstellt.

Für Minuszeichen:

  • Gibt eine Ganzzahl (Integer) zurück, die die Differenz zwischen Datum_oder_Zeit_Ausdruck2 und Datum_oder_Zeit_Ausdruck1 als Anzahl der Tage darstellt. (Die Einheiten sind immer Tage.)

Nutzungshinweise

Für DATEDIFF und Minuszeichen:

  • Werte können beispielsweise negativ sein, z. B. -12 Tage.

Für DATEDIFF:

  • Datum_oder_Zeit_Ausdruck1 und Datum_oder_Zeit_Ausdruck2 können ein Datum, eine Uhrzeit oder ein Zeitstempel sein.

  • DATEDIFF unterstützt Einheiten für Jahre, Quartale, Monate, Wochen, Tage, Stunden, Minuten, Sekunden, Millisekunden, Mikrosekunden und Nanosekunden.

  • Teil_von_Datum/Uhrzeit muss einer der unter Unterstützte Datums- und Zeitabschnitte aufgeführten Werte sein.

    Wenn Teil_von_Datum/Uhrzeit den Wert week (oder eine seiner Varianten) hat, wird die Ausgabe vom Sitzungsparameter WEEK_START gesteuert. Weitere Details einschließlich Beispiele finden Sie unter Kalenderwochen und Wochentage.

  • Die Einheit (z. B. month), die zur Berechnung der Differenz verwendet wird, bestimmt, welche Teile des Feldes DATE, TIME bzw. TIMESTAMP zur Ermittlung des Ergebnisses herangezogen werden, und bestimmt somit die Genauigkeit des Ergebnisses.

    Kleinere Einheiten werden nicht verwendet, daher werden die Werte nicht gerundet. Obwohl beispielsweise die Differenz zwischen 1. Januar 2021 und 28. Februar 2021 näher an zwei Monaten als an einem Monat liegt, ergibt die folgende Rechnung genau einen Monat:

    DATEDIFF(month, '2021-01-01'::DATE, '2021-02-28'::DATE)
    

    Für einen DATE-Wert:

    • year verwendet aus dem Wert nur das Jahr und ignoriert alle anderen Teile.

    • month verwendet aus dem Wert den Monat und das Jahr.

    • day verwendet das gesamte Datum.

    Für einen TIME-Wert:

    • hour verwendet aus dem Wert nur die Stunde und ignoriert alle anderen Teile.

    • minute verwendet aus dem Wert die Stunde und die Minute.

    • second verwendet aus dem Wert die Stunde, die Minute und die Sekunde, aber nicht die Sekundenbruchteile.

    • millisecond verwendet aus dem Wert die Stunde, die Minute und die Sekunde sowie die ersten drei Ziffern der Sekundenbruchteile. Sekundenbruchteile werden nicht gerundet. Beispiel: DATEDIFF(milliseconds, '00:00:00', '00:00:01.1239') gibt 1,123 Sekunden und nicht 1,124 Sekunden zurück.

    • microsecond verwendet aus dem Wert die Stunde, die Minute und die Sekunde sowie die ersten sechs Ziffern der Sekundenbruchteile. Sekundenbruchteile werden nicht gerundet.

    • nanosecond verwendet aus dem Wert die Stunde, die Minute und die Sekunde sowie alle neun Ziffern der Sekundenbruchteile.

    Für einen TIMESTAMP-Wert:

    Die Regeln entsprechen den obigen Regeln für die Datentypen DATE und TIME. Es werden nur die angegebene Einheit und größere Einheiten verwendet.

    Weitere Beispiele finden Sie weiter unten.

Für Minuszeichen:

  • Datum_Ausdruck1 und Datum_Ausdruck2 müssen beides Datumsangaben sein. Uhrzeiten und Zeitstempel sind nicht zulässig.

Beispiele

Berechnen der Differenz in Jahren zwischen zwei Zeitstempeln:

SELECT DATEDIFF(year, '2010-04-09 14:39:20'::TIMESTAMP, 
                      '2013-05-08 23:39:20'::TIMESTAMP) 
               AS diff_years;
+------------+
| DIFF_YEARS |
|------------|
|          3 |
+------------+

Berechnen der Differenz in Stunden zwischen zwei Zeitstempeln:

SELECT DATEDIFF(hour, '2013-05-08T23:39:20.123-07:00'::TIMESTAMP, 
    DATEADD(year, 2, ('2013-05-08T23:39:20.123-07:00')::TIMESTAMP)) 
               AS diff_hours;
+------------+
| DIFF_HOURS |
|------------|
|      17520 |
+------------+

Demonstrieren, wie Datumskomponenten DATEDIFF-Berechnungen beeinflussen und wie Minuszeichen für Datumssubtraktion verwendet wird:

SELECT column1 date_1, column2 date_2,
      DATEDIFF(year, column1, column2) diff_years,
      DATEDIFF(month, column1, column2) diff_months,
      DATEDIFF(day, column1, column2) diff_days,
      column2::DATE - column1::DATE AS diff_days_via_minus
    FROM VALUES
      ('2015-12-30', '2015-12-31'),
      ('2015-12-31', '2016-01-01'),
      ('2016-01-01', '2017-12-31'),
      ('2016-08-23', '2016-09-07');
+------------+------------+------------+-------------+-----------+---------------------+
| DATE_1     | DATE_2     | DIFF_YEARS | DIFF_MONTHS | DIFF_DAYS | DIFF_DAYS_VIA_MINUS |
|------------+------------+------------+-------------+-----------+---------------------|
| 2015-12-30 | 2015-12-31 |          0 |           0 |         1 |                   1 |
| 2015-12-31 | 2016-01-01 |          1 |           1 |         1 |                   1 |
| 2016-01-01 | 2017-12-31 |          1 |          23 |       730 |                 730 |
| 2016-08-23 | 2016-09-07 |          0 |           1 |        15 |                  15 |
+------------+------------+------------+-------------+-----------+---------------------+

Demonstrieren, wie sich Zeitkomponenten auf DATEDIFF-Berechnungen auswirken:

ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = 'DY, DD MON YYYY HH24:MI:SS';
SELECT column1 timestamp_1, column2 timestamp_2,
      DATEDIFF(hour, column1, column2) diff_hours,
      DATEDIFF(minute, column1, column2) diff_minutes,
      DATEDIFF(second, column1, column2) diff_seconds
    FROM VALUES
      ('2016-01-01 01:59:59'::TIMESTAMP, '2016-01-01 02:00:00'::TIMESTAMP),
      ('2016-01-01 01:00:00'::TIMESTAMP, '2016-01-01 01:59:00'::TIMESTAMP),
      ('2016-01-01 01:00:59'::TIMESTAMP, '2016-01-01 02:00:00'::TIMESTAMP);
+---------------------------+---------------------------+------------+--------------+--------------+
| TIMESTAMP_1               | TIMESTAMP_2               | DIFF_HOURS | DIFF_MINUTES | DIFF_SECONDS |
|---------------------------+---------------------------+------------+--------------+--------------|
| Fri, 01 Jan 2016 01:59:59 | Fri, 01 Jan 2016 02:00:00 |          1 |            1 |            1 |
| Fri, 01 Jan 2016 01:00:00 | Fri, 01 Jan 2016 01:59:00 |          0 |           59 |         3540 |
| Fri, 01 Jan 2016 01:00:59 | Fri, 01 Jan 2016 02:00:00 |          1 |           60 |         3541 |
+---------------------------+---------------------------+------------+--------------+--------------+
Zurück zum Anfang