sql >> Database >  >> RDS >> Mysql

MySQL DATEDIFF() vs TIMESTAMPDIFF():wat is het verschil?

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

  1. SQL Server verbinden met een Java-database

  2. Maximale waarde halen uit rijen en deelnemen aan een andere tabel

  3. MariaDB JSON_MERGE_PATCH() uitgelegd

  4. Hoe krijg ik SQL-tekst van Postgres-gebeurtenistrigger