Database.Guide
On janvier 27, 2022 by adminCet article examine la différence entre deux fonctions MySQL ; DATEDIFF()
et TIMESTAMPDIFF()
.
Les deux fonctions retournent 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() |
---|---|
Requiert 2 arguments. | Requiert 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é comme une valeur en jours. | Le résultat est exprimé comme l’unité fournie par le premier argument. |
Peut comparer uniquement la valeur de la date de ses arguments. | Peut comparer la valeur de la date et de l’heure de ses arguments. |
Exemple 1 – Fonctionnement de base
Voici un exemple qui dé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 |+----------+---------------+
Donc les deux fonctions retournent la différence en jours, cependant 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 deuxième.
Exemple 2 – Changer l’unité
Comme le démontre l’exemple précédent, la TIMESTAMPDIFF()
vous permet de spécifier une unité pour que les résultats soient retournés sous (en fait, elle vous demande de spécifier l’unité). D’autre part, DATEDIFF()
ne vous permet pas de spécifier une unité. Elle renvoie uniquement le résultat en jours.
On pourrait 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 |+----------+---------------+
On peut 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 d’un jour, et TIMESTAMPDIFF()
peut aller jusqu’à la microseconde. Cependant, la précision de TIMESTAMPDIFF()
(et l’unité qu’elle 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 2e date d’une seconde (ce qui l’amène au jour suivant):
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-ci en voyant comment cela se présente lorsque nous retournons les mois, les quarts et les 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 – Mauvais types d’arguments
Les deux fonctions retournent null si on leur passe 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 mélangés
Les deux fonctions vous permettent de fournir une date comme un argument et un datetime comme un 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 |+----------+---------------+
.
Laisser un commentaire