Den här artikeln tittar på skillnaden mellan två MySQL-funktioner; DATEDIFF()
och TIMESTAMPDIFF()
.
Båda funktionerna returnerar skillnaden mellan två datum och/eller tider, men resultatet är olika mellan de två funktionerna.
Följande tabell 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 (uttr1 − uttr2). | Subtraherar det 2:a argumentet från det 3:e (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 dess argument. | Kan jämföra datum- och tidsvärdet för dess argument. |
Exempel 1 – Grundläggande användning
Här är ett exempel som visar hur dessa funktioner fungerar och hur resultaten är olika, även när du 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 | +----------+---------------+
Så båda funktionerna returnerar skillnaden i dagar, men ett resultat ä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 – Byta enhet
Som föregående exempel visar, TIMESTAMPDIFF()
låter dig ange en enhet för resultaten som ska returneras som (det kräver faktiskt du att ange enheten). Å andra sidan, DATEDIFF()
tillåter dig inte att ange en enhet. Det returnerar bara resultatet på dagar.
Så vi kunde modifiera föregående exempel 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 mikrosekund. Men precisionen för TIMESTAMPDIFF()
(och den enhet som den jämför) beror 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 tar 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, den här gången 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 – Fel argumenttyper
Båda funktionerna returnerar null om de skickas av 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 låter dig ange ett datum som ett argument och en datetime 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 | +----------+---------------+