Dit artikel gaat in op het verschil tussen de MySQL TIMEDIFF()
en TIMESTAMPDIFF()
functies.
Beide functies doen hetzelfde, maar er zijn enkele significante verschillen tussen de twee.
De volgende tabel vat het verschil tussen deze twee functies samen:
TIMEDIFF() | TIMESTAMPDIFF() |
---|---|
Vereist 2 argumenten. | Vereist 3 argumenten. |
Trekt het 2e argument af van het 1e (datum1 − datum2). | Trekt het 2e argument af van het 3e (date2 − date1). |
Het resultaat wordt uitgedrukt als een tijdwaarde (en heeft de beperkingen van het gegevenstype tijd). | Resultaat is een geheel getal, uitgedrukt in een aantal eenheden zoals aangegeven door het eerste argument. |
Accepteert tijd- of datetime-expressies. | Accepteert datum- of datetime-expressies. |
Beide argumenten moeten van hetzelfde type zijn (time of datetime). | Beide argumenten kunnen van een ander type zijn (datum of datum/tijd). |
Voorbeeld 1 – Basisverschil
Hier is een voorbeeld dat het fundamentele verschil tussen deze functies laat zien.
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';
Resultaat:
+----------+---------------+ | TIMEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 24:00:00 | -24 | +----------+---------------+
Dus we kunnen zien dat TIMEEDIFF()
heeft een tijdwaarde geretourneerd, en TIMESTAMPDIFF()
een geheel getal geretourneerd.
Ook TIMEEDIFF()
de 2e datum afgetrokken van de 1e, terwijl TIMESTAMPDIFF()
de 1e datum afgetrokken van de 2e.
Voorbeeld 2 – De eenheid wijzigen
Zoals vermeld, TIMESTAMPDIFF()
stelt ons in staat om te specificeren in welke eenheid het resultaat moet worden weergegeven. Hier zijn enkele voorbeelden:
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';
Resultaat:
+----------+-------+---------+---------+ | TIMEDIFF | Hours | Minutes | Seconds | +----------+-------+---------+---------+ | 36:15:35 | -36 | -2175 | -130535 | +----------+-------+---------+---------+
Dit is echter wat er gebeurt als we een eenheid gebruiken die groter is dan het werkelijke tijdsverschil:
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';
Resultaat:
+----------+------+-------+--------+ | TIMEDIFF | Days | Weeks | Months | +----------+------+-------+--------+ | 36:15:35 | -1 | 0 | 0 | +----------+------+-------+--------+
In dit geval was het tijdsverschil niet groot genoeg om de week- of maandwaarden te beïnvloeden.
Voorbeeld 3 – Verkeerde argumenttypes
Hier is een voorbeeld van wat er gebeurt als je de verkeerde argumenttypes doorgeeft aan elke functie.
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';
Resultaat:
+---------------+--------------------+ | TIMEDIFF Date | TIMESTAMPDIFF Time | +---------------+--------------------+ | 00:00:00 | NULL | +---------------+--------------------+
De TIMEDIFF()
ondersteunt het gegevenstype 'datum' niet, en daarom retourneert het 00:00:00
.
En de TIMESTAMPDIFF()
functie ondersteunt het datatype 'tijd' niet, dus retourneert het NULL
.
Voorbeeld 4 – Gemengde argumenttypes
Dit is wat er gebeurt als je twee verschillende datatypes aan elke functie geeft.
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';
Resultaat:
+----------+---------------+ | TIMEDIFF | TIMESTAMPDIFF | +----------+---------------+ | NULL | -24 | +----------+---------------+
Dus we kunnen zien dat TIMESTAMPDIFF()
kan prima met gemengde gegevenstypes omgaan (zolang het datum of datum-en-tijd is).
Echter, TIMEDIFF()
vereist dat beide argumenten van hetzelfde type zijn, dus we krijgen NULL
, ook al zijn beide argumenten van een type dat de functie ondersteunt (tijd en datum/tijd).
We kunnen bevestigen dat beide typen in feite door deze functie worden ondersteund met het volgende voorbeeld:
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';
Resultaat:
+----------+----------+ | time | datetime | +----------+----------+ | 02:00:00 | 48:00:00 | +----------+----------+
Dus het is prima, zolang beide argumenten van hetzelfde type zijn (ofwel tijd- of datetime-waarden).