Database.Guide
On januari 27, 2022 by adminDenna artikel tittar på skillnaden mellan två MySQL-funktioner; DATEDIFF()
och TIMESTAMPDIFF()
.
Båda funktionerna returnerar skillnaden mellan två datum och/eller tidpunkter, men resultatet är olika mellan de två funktionerna.
Nedan följer en tabell som sammanfattar skillnaden mellan dessa två funktioner:
DATEDIFF() |
TIMESTAMPDIFF() |
---|---|
Kräver 2 argument. | Kräver 3 argument. |
Subtraherar det andra argumentet från det första (expr1 – expr2). | Subtraherar det andra argumentet från det tredje (expr2 – expr1). |
Resultatet uttrycks som ett värde i dagar. | Resultatet uttrycks som den enhet som tillhandahålls av det första argumentet. |
Kan endast jämföra datumvärdet för sina argument. | Kan jämföra datum- och tidsvärdet för sina argument. |
Exempel 1 – Grundläggande funktion
Här är ett exempel som visar hur dessa funktioner fungerar och hur resultaten skiljer sig åt, även om man använder samma enhet.
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';
Resultat:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -1 |+----------+---------------+
Båda funktionerna returnerar alltså skillnaden i dagar, men det ena resultatet är positivt och det andra negativt. Detta beror på att DATEDIFF()
subtraherar det andra datumet från det första, medan TIMESTAMPDIFF()
subtraherar det första datumet från det andra.
Exempel 2 – Ändra enhet
Som det föregående exemplet visar kan du med TIMESTAMPDIFF()
ange en enhet som resultaten ska returneras som (i själva verket kräver den att du anger enheten). Å andra sidan tillåter DATEDIFF()
inte att du anger en enhet. Den returnerar endast resultatet i dagar.
Så vi kan ändra det tidigare exemplet så att TIMESTAMPDIFF()
returnerar antalet timmar istället för dagar:
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';
Resultat:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -24 |+----------+---------------+
Du kan gå hela vägen till mikrosekunder:
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';
Resultat:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -86400000000 |+----------+---------------+
Exempel 3 – Precision
Precisionen för DATEDIFF()
är en dag, och TIMESTAMPDIFF()
kan gå ner till mikrosekunden. Precisionen för TIMESTAMPDIFF()
(och enheten som den jämför) beror dock fortfarande på den angivna enheten.
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';
Resultat:
+----------+------+-------+---------+---------+--------------+| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |+----------+------+-------+---------+---------+--------------+| 0 | 0 | 23 | 1439 | 86399 | 86399000000 |+----------+------+-------+---------+---------+--------------+
Och här är resultatet om vi ökar det andra datumet med en sekund (vilket för det till nästa dag):
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';
Resultat:
+----------+------+-------+---------+---------+--------------+| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |+----------+------+-------+---------+---------+--------------+| -1 | 1 | 24 | 1440 | 86400 | 86400000000 |+----------+------+-------+---------+---------+--------------+
Här är ett annat exempel, denna gång för att se hur det ser ut när vi returnerar månader, kvartal och år när skillnaden är en månad (eller 31 dagar):
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';
Resultat:
+----------+------+-------+---------+------+| DATEDIFF | Days | Month | Quarter | Year |+----------+------+-------+---------+------+| -31 | 31 | 1 | 0 | 0 |+----------+------+-------+---------+------+
Exempel 4 – Felaktiga argumenttyper
Båda funktionerna returnerar null om de får fel argumenttyp.
SET @time1 = '12:15:35', @time2 = '00:00:00';SELECT DATEDIFF(@time1, @time2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';
Resultat:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| NULL | NULL |+----------+---------------+
Exempel 5 – Blandade argumenttyper
Båda funktionerna gör det möjligt att ange ett datum som ett argument och en datumtid som ett annat 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';
Resultat:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -1 |+----------+---------------+
Lämna ett svar