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

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

Dieser Artikel befasst sich mit dem Unterschied zwischen MySQL TIMEDIFF() und TIMESTAMPDIFF() Funktionen.

Beide Funktionen tun etwas Ähnliches, aber es gibt einige signifikante Unterschiede zwischen den beiden.

Die folgende Tabelle fasst den Unterschied zwischen diesen beiden Funktionen zusammen:

TIMEDIFF() TIMESTAMPDIFF()
Erfordert 2 Argumente. Erfordert 3 Argumente.
Subtrahiert das 2. Argument vom 1. (date1 − date2). Subtrahiert das 2. Argument vom 3. (date2 − date1).
Das Ergebnis wird als Zeitwert ausgedrückt (und hat die Beschränkungen des Zeitdatentyps). Das Ergebnis ist eine Ganzzahl, ausgedrückt durch eine Anzahl von Einheiten, wie vom ersten Argument angegeben.
Akzeptiert Zeit- oder Datumszeit-Ausdrücke. Akzeptiert Datums- oder Datetime-Ausdrücke.
Beide Argumente müssen vom gleichen Typ sein (entweder time oder datetime). Beide Argumente können von unterschiedlichem Typ sein (date oder datetime).

Beispiel 1 – Grundlegender Unterschied

Hier ist ein Beispiel, das den grundlegenden Unterschied zwischen diesen Funktionen demonstriert.

SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF',
  TIMESTAMPDIFF(hour, @date1, @date2) AS 'TIMESTAMPDIFF';

Ergebnis:

+----------+---------------+
| TIMEDIFF | TIMESTAMPDIFF |
+----------+---------------+
| 24:00:00 |           -24 |
+----------+---------------+

Wir können also TIMEEDIFF() sehen hat einen Zeitwert zurückgegeben und TIMESTAMPDIFF() gab eine ganze Zahl zurück.

Auch TIMEEDIFF() subtrahiert das 2. Datum vom 1., während TIMESTAMPDIFF() das 1. Datum vom 2. subtrahiert.

Beispiel 2 – Ändern der Einheit

Wie bereits erwähnt, TIMESTAMPDIFF() ermöglicht es uns festzulegen, in welcher Einheit das Ergebnis dargestellt werden soll. Hier sind einige Beispiele:

SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF',
  TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours',
  TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes',
  TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds';

Ergebnis:

+----------+-------+---------+---------+
| TIMEDIFF | Hours | Minutes | Seconds |
+----------+-------+---------+---------+
| 36:15:35 |   -36 |   -2175 | -130535 |
+----------+-------+---------+---------+

Folgendes passiert jedoch, wenn wir eine Einheit verwenden, die größer ist als die tatsächliche Zeitdifferenz:

SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF',
  TIMESTAMPDIFF(day, @date1, @date2) AS 'Days',
  TIMESTAMPDIFF(week, @date1, @date2) AS 'Weeks',
  TIMESTAMPDIFF(month, @date1, @date2) AS 'Months';

Ergebnis:

+----------+------+-------+--------+
| TIMEDIFF | Days | Weeks | Months |
+----------+------+-------+--------+
| 36:15:35 |   -1 |     0 |      0 |
+----------+------+-------+--------+

In diesem Fall war der Zeitunterschied nicht groß genug, um die Wochen- oder Monatswerte zu beeinflussen.

Beispiel 3 – Falsche Argumenttypen

Hier ist ein Beispiel dafür, was passiert, wenn Sie die falschen Argumenttypen an die einzelnen Funktionen übergeben.

SET @date1 = '2010-10-11', @date2 = '2010-10-10', @time1 = '12:15:35', @time2 = '00:00:00';
SELECT 
  TIMEDIFF(@date1, @date2) AS 'TIMEDIFF Date',
  TIMESTAMPDIFF(hour, @time1, @time2) AS 'TIMESTAMPDIFF Time';

Ergebnis:

+---------------+--------------------+
| TIMEDIFF Date | TIMESTAMPDIFF Time |
+---------------+--------------------+
| 00:00:00      |               NULL |
+---------------+--------------------+

Das TIMEDIFF() unterstützt den Datentyp „Datum“ nicht und gibt daher 00:00:00 zurück .

Und das TIMESTAMPDIFF() Die Funktion unterstützt den Datentyp „Zeit“ nicht, daher gibt sie NULL zurück .

Beispiel 4 – Gemischte Argumenttypen

Folgendes passiert, wenn Sie jeder Funktion zwei verschiedene Datentypen bereitstellen.

SET @thedate = '2010-10-11', @thetime = '12:15:35', @thedatetime = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@thetime, @thedatetime) AS 'TIMEDIFF',
  TIMESTAMPDIFF(hour, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';

Ergebnis:

+----------+---------------+
| TIMEDIFF | TIMESTAMPDIFF |
+----------+---------------+
| NULL     |           -24 |
+----------+---------------+

Also können wir diesen TIMESTAMPDIFF() sehen handhabt gemischte Datentypen gut (solange sie entweder Datum oder Datum und Uhrzeit sind).

Allerdings TIMEDIFF() erfordert, dass beide Argumente vom gleichen Typ sind, also erhalten wir NULL , obwohl beide Argumente von einem Typ sind, den die Funktion unterstützt (time und datetime).

Wir können anhand des folgenden Beispiels bestätigen, dass beide Typen tatsächlich von dieser Funktion unterstützt werden:

SET @thetime1 = '12:15:35', @thetime2 = '10:15:35', @thedatetime1 = '2010-10-12 00:00:00', @thedatetime2 = '2010-10-10 00:00:00';
SELECT 
  TIMEDIFF(@thetime1, @thetime2) AS 'time',
  TIMEDIFF(@thedatetime1, @thedatetime2) AS 'datetime';

Ergebnis:

+----------+----------+
| time     | datetime |
+----------+----------+
| 02:00:00 | 48:00:00 |
+----------+----------+

Es ist also in Ordnung, solange beide Argumente denselben Typ haben (entweder Zeit- oder Datumszeitwerte).