Dieser Artikel befasst sich mit dem Unterschied zwischen zwei MySQL-Funktionen; DATEDIFF()
und TIMESTAMPDIFF()
.
Beide Funktionen geben die Differenz zwischen zwei Datumsangaben und/oder Uhrzeiten zurück, aber das Ergebnis ist zwischen den beiden Funktionen unterschiedlich.
Die folgende Tabelle fasst den Unterschied zwischen diesen beiden Funktionen zusammen:
DATEDIFF() | TIMESTAMPDIFF() |
---|---|
Erfordert 2 Argumente. | Erfordert 3 Argumente. |
Subtrahiert das 2. Argument vom 1. (expr1 − expr2). | Subtrahiert das 2. Argument vom 3. (expr2 − expr1). |
Das Ergebnis wird als Wert in Tagen ausgedrückt. | Das Ergebnis wird als Einheit ausgedrückt, die durch das erste Argument bereitgestellt wird. |
Kann nur den Datumswert seiner Argumente vergleichen. | Kann den Datums- und Zeitwert seiner Argumente vergleichen. |
Beispiel 1 – Grundlegende Bedienung
Hier ist ein Beispiel, das zeigt, wie diese Funktionen funktionieren und wie unterschiedlich die Ergebnisse sind, selbst wenn dieselbe Einheit verwendet wird.
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 | +----------+---------------+
Beide Funktionen geben also die Differenz in Tagen zurück, jedoch ist ein Ergebnis positiv und das andere negativ. Das liegt daran, dass DATEDIFF()
subtrahiert das zweite Datum vom ersten, während TIMESTAMPDIFF()
subtrahiert das erste Datum vom zweiten.
Beispiel 2 – Ändern der Einheit
Wie das vorherige Beispiel zeigt, ist der TIMESTAMPDIFF()
ermöglicht es Ihnen, eine Einheit für die zurückzugebenden Ergebnisse anzugeben (tatsächlich erfordert Sie können die Einheit angeben). Andererseits DATEDIFF()
erlaubt Ihnen nicht, eine Einheit anzugeben. Es gibt nur das Ergebnis in Tagen zurück.
Wir könnten also das vorherige Beispiel so ändern, dass TIMESTAMPDIFF()
gibt die Anzahl der Stunden statt der Tage zurück:
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 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 – Präzision
Die Genauigkeit von DATEDIFF()
ist ein Tag und TIMESTAMPDIFF()
kann bis auf die Mikrosekunde gehen. Allerdings die Genauigkeit von TIMESTAMPDIFF()
(und die Einheit, die es vergleicht) hängt 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 2. Datum um eine Sekunde erhöhen (was es zum 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, dieses Mal sehen Sie, 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
Bei beiden Funktionen können Sie ein Datum als ein Argument und eine Datumszeit als ein weiteres Argument angeben.
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 | +----------+---------------+