Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL DATEDIFF() vs TIMESTAMPDIFF() :Quelle est la différence ?

Cet article examine la différence entre deux fonctions MySQL ; DATEDIFF() et TIMESTAMPDIFF() .

Les deux fonctions renvoient la différence entre deux dates et/ou heures, mais le résultat est différent entre les deux fonctions.

Le tableau suivant résume la différence entre ces deux fonctions :

DATEDIFF() TIMESTAMPDIFF()
Nécessite 2 arguments. Nécessite 3 arguments.
Soustrait le 2ème argument du 1er (expr1 − expr2). Soustrait le 2ème argument du 3ème (expr2 − expr1).
Le résultat est exprimé sous forme de valeur en jours. Le résultat est exprimé dans l'unité fournie par le premier argument.
Peut comparer uniquement la valeur de date de ses arguments. Peut comparer la date et l'heure de ses arguments.

Exemple 1 - Fonctionnement de base

Voici un exemple qui montre comment ces fonctions fonctionnent et comment les résultats sont différents, même en utilisant la même unité.

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';

Résultat :

+----------+---------------+
| DATEDIFF | TIMESTAMPDIFF |
+----------+---------------+
|        1 |            -1 |
+----------+---------------+

Ainsi, les deux fonctions renvoient la différence en jours, mais un résultat est positif et l'autre négatif. C'est parce que DATEDIFF() soustrait la deuxième date de la première, alors que TIMESTAMPDIFF() soustrait la première date de la seconde.

Exemple 2 - Changement d'unité

Comme le montre l'exemple précédent, le TIMESTAMPDIFF() vous permet de spécifier une unité pour les résultats à renvoyer (en fait, cela nécessite à vous de préciser l'unité). D'autre part, DATEDIFF() ne vous permet pas de spécifier une unité. Il ne renvoie que le résultat en jours.

Nous pourrions donc modifier l'exemple précédent pour que TIMESTAMPDIFF() renvoie le nombre d'heures au lieu de jours :

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';

Résultat :

+----------+---------------+
| DATEDIFF | TIMESTAMPDIFF |
+----------+---------------+
|        1 |           -24 |
+----------+---------------+

Vous pouvez aller jusqu'à la microseconde :

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';

Résultat :

+----------+---------------+
| DATEDIFF | TIMESTAMPDIFF |
+----------+---------------+
|        1 |  -86400000000 |
+----------+---------------+

Exemple 3 – Précision

La précision de DATEDIFF() est un jour, et TIMESTAMPDIFF() peut descendre à la microseconde. Cependant la précision de TIMESTAMPDIFF() (et l'unité qu'il compare) dépend toujours de l'unité spécifiée.

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';

Résultat :

+----------+------+-------+---------+---------+--------------+
| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |
+----------+------+-------+---------+---------+--------------+
|        0 |    0 |    23 |    1439 |   86399 |  86399000000 |
+----------+------+-------+---------+---------+--------------+

Et voici le résultat si on incrémente la 2ème date d'une seconde (ce qui la ramène au lendemain) :

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';

Résultat :

+----------+------+-------+---------+---------+--------------+
| DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds |
+----------+------+-------+---------+---------+--------------+
|       -1 |    1 |    24 |    1440 |   86400 |  86400000000 |
+----------+------+-------+---------+---------+--------------+

Voici un autre exemple, cette fois pour voir à quoi cela ressemble lorsque nous renvoyons des mois, des trimestres et des années lorsque la différence est d'un mois (ou 31 jours) :

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';

Résultat :

+----------+------+-------+---------+------+
| DATEDIFF | Days | Month | Quarter | Year |
+----------+------+-------+---------+------+
|      -31 |   31 |     1 |       0 |    0 |
+----------+------+-------+---------+------+

Exemple 4 - Types d'arguments incorrects

Les deux fonctions renvoient null si elles reçoivent le mauvais type d'argument.

SET @time1 = '12:15:35', @time2 = '00:00:00';
SELECT 
  DATEDIFF(@time1, @time2) AS 'DATEDIFF',
  TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';

Résultat :

+----------+---------------+
| DATEDIFF | TIMESTAMPDIFF |
+----------+---------------+
|     NULL |          NULL |
+----------+---------------+

Exemple 5 – Types d'arguments mixtes

Les deux fonctions vous permettent de fournir une date comme argument et une date/heure comme autre 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';

Résultat :

+----------+---------------+
| DATEDIFF | TIMESTAMPDIFF |
+----------+---------------+
|        1 |            -1 |
+----------+---------------+