Dit 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() |
---|---|
Vereist 2 argumenten. | Vereist 3 argumenten. |
Trekt het 2e argument af van het 1e (expr1 − expr2). | Trekt het 2e argument af van de 3e (expr2 − expr1). |
Het resultaat wordt uitgedrukt als een waarde in dagen. | Resultaat wordt uitgedrukt als de eenheid van het eerste argument. |
Kan alleen de datumwaarde van zijn argumenten vergelijken. | Kan de datum- en tijdwaarde van zijn argumenten vergelijken. |
Voorbeeld 1 – Basisbediening
Hier is een voorbeeld dat laat zien hoe deze functies werken en hoe de resultaten verschillen, zelfs bij gebruik van hetzelfde apparaat.
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 | +----------+---------------+
Dus beide functies retourneren het verschil in dagen, maar het ene resultaat is positief en het andere negatief. Dit komt omdat DATEDIFF()
trekt de tweede datum van de eerste af, terwijl TIMESTAMPDIFF()
trekt de eerste datum van de tweede af.
Voorbeeld 2 – De eenheid wijzigen
Zoals het vorige voorbeeld laat zien, is de TIMESTAMPDIFF()
stelt u in staat een eenheid te specificeren voor de resultaten die moeten worden geretourneerd als (in feite is dit vereist u om de eenheid op te geven). Aan de andere kant, DATEDIFF()
kunt u geen eenheid specificeren. Het resultaat wordt alleen in dagen geretourneerd.
We zouden het vorige voorbeeld dus kunnen wijzigen zodat TIMESTAMPDIFF()
geeft het aantal uren terug in plaats van dagen:
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 | +----------+---------------+
Je 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 | +----------+---------------+
Voorbeeld 3 – Precisie
De precisie van DATEDIFF()
is één dag, en TIMESTAMPDIFF()
kan tot op de microseconde gaan. Maar de precisie van TIMESTAMPDIFF()
(en de eenheid die het vergelijkt) hangt nog steeds af van de gespecificeerde 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 (waardoor het naar de volgende dag komt):
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 nog een voorbeeld, dit keer om te zien hoe het eruitziet wanneer we maanden, kwartalen en jaren retourneren wanneer het verschil één maand (of 31 dagen) is:
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 | +----------+------+-------+---------+------+
Voorbeeld 4 – Verkeerde argumenttypes
Beide functies retourneren null als ze het verkeerde argumenttype hebben gekregen.
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 argumenttypes
Met beide functies kunt u een datum opgeven als een argument en een datumtijd 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 | +----------+---------------+