Database.Guide
On januari 27, 2022 by adminDit artikel gaat in op het verschil tussen twee MySQL functies; DATEDIFF()
en TIMESTAMPDIFF()
.
Beide functies retourneren het verschil tussen twee datums en/of tijden, maar het resultaat is verschillend tussen de twee functies.
De volgende tabel vat het verschil tussen deze twee functies samen:
DATEDIFF() |
TIMESTAMPDIFF() |
---|---|
Vraagt om 2 argumenten. | Vraagt 3 argumenten. |
Trekt het 2e argument af van het 1e (expr1 – expr2). | Trekt het 2e argument af van het 3e (expr2 – expr1). |
Het resultaat wordt uitgedrukt als een waarde in dagen. | Het resultaat wordt uitgedrukt als de eenheid die door het eerste argument wordt opgegeven. |
Kan alleen de datumwaarde van zijn argumenten vergelijken. | Kan de datum- en tijdwaarde van zijn argumenten vergelijken. |
Voorbeeld 1 – Basisbewerking
Hier volgt een voorbeeld dat laat zien hoe deze functies werken, en hoe de resultaten verschillend zijn, zelfs bij gebruik van dezelfde eenheid.
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';
Resultaat:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -1 |+----------+---------------+
Zo geven beide functies het verschil in dagen terug, maar het ene resultaat is positief en het andere negatief. Dit komt omdat DATEDIFF()
de tweede datum aftrekt van de eerste, terwijl TIMESTAMPDIFF()
de eerste datum aftrekt van de tweede.
Voorbeeld 2 – De eenheid wijzigen
Zoals het vorige voorbeeld laat zien, kunt u met TIMESTAMPDIFF()
een eenheid opgeven voor de resultaten die moeten worden geretourneerd (in feite vereist het u om de eenheid op te geven). Met DATEDIFF()
daarentegen kunt u geen eenheid opgeven. Het geeft alleen het resultaat in dagen.
Dus we kunnen het vorige voorbeeld zo wijzigen dat TIMESTAMPDIFF()
het aantal uren in plaats van dagen teruggeeft:
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';
Resultaat:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -24 |+----------+---------------+
U kunt helemaal tot microseconden gaan:
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';
Resultaat:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -86400000000 |+----------+---------------+
Exemplaar 3 – Precisie
De precisie van DATEDIFF()
is een dag, en TIMESTAMPDIFF()
kan tot op de microseconde gaan. De precisie van TIMESTAMPDIFF()
(en de eenheid waarmee het vergelijkt) hangt echter nog steeds af van de opgegeven eenheid.
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';
Resultaat:
+----------+------+-------+---------+---------+--------------+| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |+----------+------+-------+---------+---------+--------------+| 0 | 0 | 23 | 1439 | 86399 | 86399000000 |+----------+------+-------+---------+---------+--------------+
En hier is het resultaat als we de 2e datum met één seconde verhogen (wat het naar de volgende dag brengt):
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';
Resultaat:
+----------+------+-------+---------+---------+--------------+| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |+----------+------+-------+---------+---------+--------------+| -1 | 1 | 24 | 1440 | 86400 | 86400000000 |+----------+------+-------+---------+---------+--------------+
Hier is een ander voorbeeld, dit keer zien we hoe het eruit ziet als we maanden, kwartalen en jaren teruggeven wanneer het verschil één maand is (of 31 dagen):
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';
Resultaat:
+----------+------+-------+---------+------+| DATEDIFF | Days | Month | Quarter | Year |+----------+------+-------+---------+------+| -31 | 31 | 1 | 0 | 0 |+----------+------+-------+---------+------+
Exemplaar 4 – Verkeerde argumenttypen
Beide functies retourneren null als ze het verkeerde argumenttype krijgen doorgegeven.
SET @time1 = '12:15:35', @time2 = '00:00:00';SELECT DATEDIFF(@time1, @time2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';
Resultaat:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| NULL | NULL |+----------+---------------+
Voorbeeld 5 – Gemengde argumenttypen
Beide functies staan u toe een datum als een argument op te geven en een datetime als een ander argument.
SET @thedate = '2010-10-11', @thedatetime = '2010-10-10 00:00:00';SELECT DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF', TIMESTAMPDIFF(day, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';
Resultaat:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -1 |+----------+---------------+
Geef een antwoord