- Kategorien:
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.
Sie können auch das Minuszeichen (-
) verwenden, um die Differenz zwischen zwei Daten zu berechnen, indem Sie das eine Datum vom anderen abziehen.
Um Zeiteinheiten zu einem Datum, einer Uhrzeit oder einem Zeitstempel zu addieren (z. B. zwei Tage zu einem Datum hinzufügen) oder Zeiteinheiten davon zu subtrahieren, können Sie die Funktionen DATEADD, TIMEADD oder TIMESTAMPADD verwenden.
- Siehe auch:
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:
date_or_time_part
Die Maßeinheit für die Zeit. Muss einer der Werte sein, die in Unterstützte Datums- und Uhrzeitkomponenten aufgeführt sind (z. B.
month
). Der Wert kann eine Zeichenfolgeliteral sein oder nicht in Anführungszeichen stehen (z. B.'month'
odermonth
).date_or_time_expr1
,date_or_time_expr2
Die zu vergleichenden Werte. Diese 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
date_or_time_expr1
-Wert wird vomdate_or_time_expr2
-Wert abgezogen.
Für Minuszeichen:
date_expr1
,date_expr2
Die zu vergleichenden Werte. Diese müssen ein Datum oder ein Ausdruck sein, das bzw. der sich zu einem Datum auswerten lässt. Der
date_expr1
-Wert wird vomdate_expr2
-Wert abgezogen.
Rückgabewerte¶
Für DATEDIFF:
Gibt eine Ganzzahl (Integer) zurück, die die Differenz in der Anzahl der Einheiten (Sekunden, Tage usw.) zwischen date_or_time_expr2
und date_or_time_expr1
angibt.
Gibt NULL zurück, wenn ein Argument NULL ist.
Für Minuszeichen:
Gibt eine Ganzzahl (Integer) zurück, die die Differenz zwischen date_expr2
und date_expr1
als Anzahl der Tage darstellt. (Die Einheiten sind immer Tage.)
Gibt einen Fehler zurück, wenn date_expr2
oder date_expr1
NULL ist.
Nutzungshinweise¶
Für DATEDIFF und Minuszeichen:
Werte können beispielsweise negativ sein, z. B. -12 Tage.
Für DATEDIFF:
Die Funktion unterstützt Maßeinheiten für Jahre, Quartale, Monate, Wochen, Tage, Stunden, Minuten, Sekunden, Millisekunden, Mikrosekunden und Nanosekunden.
Wenn
date_or_time_part
den Wertweek
(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 zur Berechnung der Differenz verwendete Einheit (z. B.
month
) bestimmt, welche Teile des Feldes DATE, TIME oder TIMESTAMP ausgewertet werden. Die Einheit bestimmt also die Präzision 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, '2024-02-20 21:18:41.0000', '2024-02-20 21:18:42.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.
Für Minuszeichen:
Die Werte von
date_expr1
unddate_expr2
müssen beide Datumsangaben sein. Uhrzeiten und Zeitstempel sind nicht zulässig.
Beispiele¶
Berechnen der Differenz in Jahren zwischen zwei Zeitstempeln:
SELECT DATEDIFF(year,
'2020-04-09 14:39:20'::TIMESTAMP,
'2023-05-08 23:39:20'::TIMESTAMP)
AS diff_years;
+------------+
| DIFF_YEARS |
|------------|
| 3 |
+------------+
Berechnen der Differenz in Stunden zwischen zwei Zeitstempeln:
SELECT DATEDIFF(hour,
'2023-05-08T23:39:20.123-07:00'::TIMESTAMP,
DATEADD(year, 2, ('2023-05-08T23:39:20.123-07:00')::TIMESTAMP))
AS diff_hours;
+------------+
| DIFF_HOURS |
|------------|
| 17544 |
+------------+
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 |
+---------------------------+---------------------------+------------+--------------+--------------+
Verwenden Sie die Funktion CURRENT_TIMESTAMP mit der DATEDIFF-Funktion, um die Differenz in Jahren, Monaten und Tagen zwischen einem angegebenen Zeitstempel und dem aktuellen Zeitstempel zu berechnen:
SELECT column1 specified_timestamp,
column2 timestamp_now,
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
('2012-08-23 09:00:00.000 -0700', CURRENT_TIMESTAMP);
+-------------------------------+-------------------------------+------------+-------------+-----------+---------------------+
| SPECIFIED_TIMESTAMP | TIMESTAMP_NOW | DIFF_YEARS | DIFF_MONTHS | DIFF_DAYS | DIFF_DAYS_VIA_MINUS |
|-------------------------------+-------------------------------+------------+-------------+-----------+---------------------|
| 2012-08-23 09:00:00.000 -0700 | 2024-09-04 17:21:12.189 -0700 | 12 | 145 | 4395 | 4395 |
+-------------------------------+-------------------------------+------------+-------------+-----------+---------------------+