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