Database.Guide
On Januar 27, 2022 by adminDieser Artikel befasst sich mit dem Unterschied zwischen zwei MySQL-Funktionen: DATEDIFF()
und TIMESTAMPDIFF()
.
Beide Funktionen geben die Differenz zwischen zwei Datums- und/oder Zeitangaben zurück, aber das Ergebnis ist bei beiden Funktionen unterschiedlich.
Die folgende Tabelle fasst den Unterschied zwischen diesen beiden Funktionen zusammen:
DATEDIFF() |
TIMESTAMPDIFF() |
---|---|
Erfordert 2 Argumente. | Erfordert 3 Argumente. |
Subtrahiert das zweite Argument vom ersten (expr1 – expr2). | Subtrahiert das zweite Argument vom dritten (expr2 – expr1). |
Ergebnis wird als Wert in Tagen ausgedrückt. | Ergebnis wird in der Einheit ausgedrückt, die das erste Argument liefert. |
Kann nur den Datumswert seiner Argumente vergleichen. | Kann den Datums- und Zeitwert seiner Argumente vergleichen. |
Beispiel 1 – Grundlegende Operation
Hier ist ein Beispiel, das zeigt, wie diese Funktionen funktionieren und wie unterschiedlich die Ergebnisse sind, auch wenn sie dieselbe Einheit verwenden.
SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00';SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'TIMESTAMPDIFF';
Ergebnis:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -1 |+----------+---------------+
So geben beide Funktionen die Differenz in Tagen zurück, aber ein Ergebnis ist positiv und das andere negativ. Das liegt daran, dass DATEDIFF()
das zweite Datum vom ersten subtrahiert, während TIMESTAMPDIFF()
das erste Datum vom zweiten subtrahiert.
Beispiel 2 – Ändern der Einheit
Wie das vorige Beispiel zeigt, können Sie bei TIMESTAMPDIFF()
eine Einheit angeben, in der die Ergebnisse zurückgegeben werden sollen (tatsächlich müssen Sie die Einheit angeben). Bei DATEDIFF()
hingegen können Sie keine Einheit angeben. Sie gibt das Ergebnis nur in Tagen zurück.
Wir könnten also das vorherige Beispiel so abändern, dass TIMESTAMPDIFF()
die Anzahl der Stunden statt der Tage zurückgibt:
SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00';SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(hour, @date1, @date2) AS 'TIMESTAMPDIFF';
Ergebnis:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -24 |+----------+---------------+
Sie können auch bis zu Mikrosekunden gehen:
SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00';SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(microsecond, @date1, @date2) AS 'TIMESTAMPDIFF';
Ergebnis:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -86400000000 |+----------+---------------+
Beispiel 3 – Genauigkeit
Die Genauigkeit von DATEDIFF()
ist ein Tag, und TIMESTAMPDIFF()
kann bis auf die Mikrosekunde genau sein. Die Genauigkeit von TIMESTAMPDIFF()
(und der Vergleichseinheit) hängt jedoch immer noch von der angegebenen Einheit ab.
SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-10-10 23:59:59';SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'Days', TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours', TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes', TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds', TIMESTAMPDIFF(microsecond, @date1, @date2) AS 'Microseconds';
Ergebnis:
+----------+------+-------+---------+---------+--------------+| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |+----------+------+-------+---------+---------+--------------+| 0 | 0 | 23 | 1439 | 86399 | 86399000000 |+----------+------+-------+---------+---------+--------------+
Und hier ist das Ergebnis, wenn wir das zweite Datum um eine Sekunde erhöhen (was es auf den nächsten Tag bringt):
SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-10-11 00:00:00';SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'Days', TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours', TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes', TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds', TIMESTAMPDIFF(microsecond, @date1, @date2) AS 'Microseconds';
Ergebnis:
+----------+------+-------+---------+---------+--------------+| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |+----------+------+-------+---------+---------+--------------+| -1 | 1 | 24 | 1440 | 86400 | 86400000000 |+----------+------+-------+---------+---------+--------------+
Hier ist ein weiteres Beispiel, diesmal sehen wir, wie es aussieht, wenn wir Monate, Quartale und Jahre zurückgeben, wenn die Differenz einen Monat (oder 31 Tage) beträgt:
SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-11-10 00:00:00';SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'Days', TIMESTAMPDIFF(month, @date1, @date2) AS 'Month', TIMESTAMPDIFF(quarter, @date1, @date2) AS 'Quarter', TIMESTAMPDIFF(year, @date1, @date2) AS 'Year';
Ergebnis:
+----------+------+-------+---------+------+| DATEDIFF | Days | Month | Quarter | Year |+----------+------+-------+---------+------+| -31 | 31 | 1 | 0 | 0 |+----------+------+-------+---------+------+
Beispiel 4 – Falsche Argumenttypen
Beide Funktionen geben Null zurück, wenn ihnen der falsche Argumenttyp übergeben wird.
SET @time1 = '12:15:35', @time2 = '00:00:00';SELECT DATEDIFF(@time1, @time2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';
Ergebnis:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| NULL | NULL |+----------+---------------+
Beispiel 5 – Gemischte Argumenttypen
Beide Funktionen erlauben es, ein Datum als ein Argument und eine Datetime als ein anderes Argument zu übergeben.
SET @thedate = '2010-10-11', @thedatetime = '2010-10-10 00:00:00';SELECT DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF', TIMESTAMPDIFF(day, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';
Ergebnis:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -1 |+----------+---------------+
Schreibe einen Kommentar