Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL DATEDIFF() vs. TIMESTAMPDIFF():Was ist der Unterschied?

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 |
+----------+---------------+