sql >> Databasteknik >  >> RDS >> Mysql

MySQL DATEDIFF() vs TIMESTAMPDIFF():Vad är skillnaden?

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 |
+----------+---------------+

  1. Får du använda siffror som tabellnamn i MySQL?

  2. Beräkna medianen med en dynamisk markör

  3. Hur man skriver ut året när man formaterar ett datum i Oracle

  4. Klassen hittades inte laddar JDBC org.postgresql.Driver