Cet article examine la différence entre MySQL TIMEDIFF()
et TIMESTAMPDIFF()
fonctions.
Les deux fonctions font une chose similaire, mais il existe des différences significatives entre les deux.
Le tableau suivant résume la différence entre ces deux fonctions :
TIMEDIFF() | TIMESTAMPDIFF() |
---|---|
Nécessite 2 arguments. | Nécessite 3 arguments. |
Soustrait le 2ème argument du 1er (date1 − date2). | Soustrait le 2ème argument du 3ème (date2 − date1). |
Le résultat est exprimé sous forme de valeur temporelle (et il a les limites du type de données temporelles). | Le résultat est un entier, exprimé par un nombre d'unités fourni par le premier argument. |
Accepte les expressions d'heure ou de date/heure. | Accepte les expressions date ou datetime. |
Les deux arguments doivent être du même type (heure ou date/heure). | Les deux arguments peuvent être de type différent (date ou datetime). |
Exemple 1 - Différence de base
Voici un exemple qui illustre la différence fondamentale entre ces fonctions.
SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00'; SELECT TIMEDIFF(@date1, @date2) AS 'TIMEDIFF', TIMESTAMPDIFF(hour, @date1, @date2) AS 'TIMESTAMPDIFF';
Résultat :
+----------+---------------+ | TIMEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 24:00:00 | -24 | +----------+---------------+
Nous pouvons donc voir que TIMEEDIFF()
renvoyé une valeur de temps, et TIMESTAMPDIFF()
renvoyé un entier.
Aussi, TIMEEDIFF()
soustrait la 2ème date de la 1ère, tandis que TIMESTAMPDIFF()
soustrait la 1ère date de la 2ème.
Exemple 2 - Changement d'unité
Comme mentionné, TIMESTAMPDIFF()
permet de spécifier dans quelle unité représenter le résultat. Voici quelques exemples :
SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00'; SELECT TIMEDIFF(@date1, @date2) AS 'TIMEDIFF', TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours', TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes', TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds';
Résultat :
+----------+-------+---------+---------+ | TIMEDIFF | Hours | Minutes | Seconds | +----------+-------+---------+---------+ | 36:15:35 | -36 | -2175 | -130535 | +----------+-------+---------+---------+
Cependant, voici ce qui se passe si nous utilisons une unité supérieure au décalage horaire réel :
SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00'; SELECT TIMEDIFF(@date1, @date2) AS 'TIMEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'Days', TIMESTAMPDIFF(week, @date1, @date2) AS 'Weeks', TIMESTAMPDIFF(month, @date1, @date2) AS 'Months';
Résultat :
+----------+------+-------+--------+ | TIMEDIFF | Days | Weeks | Months | +----------+------+-------+--------+ | 36:15:35 | -1 | 0 | 0 | +----------+------+-------+--------+
Dans ce cas, le décalage horaire n'était pas assez important pour affecter les valeurs de la semaine ou du mois.
Exemple 3 - Types d'arguments incorrects
Voici un exemple de ce qui se passe lorsque vous passez les mauvais types d'arguments à chaque fonction.
SET @date1 = '2010-10-11', @date2 = '2010-10-10', @time1 = '12:15:35', @time2 = '00:00:00'; SELECT TIMEDIFF(@date1, @date2) AS 'TIMEDIFF Date', TIMESTAMPDIFF(hour, @time1, @time2) AS 'TIMESTAMPDIFF Time';
Résultat :
+---------------+--------------------+ | TIMEDIFF Date | TIMESTAMPDIFF Time | +---------------+--------------------+ | 00:00:00 | NULL | +---------------+--------------------+
Le TIMEDIFF()
ne prend pas en charge le type de données "date", et renvoie donc 00:00:00
.
Et le TIMESTAMPDIFF()
la fonction ne prend pas en charge le type de données 'time', elle renvoie donc NULL
.
Exemple 4 - Types d'arguments mixtes
Voici ce qui se passe si vous fournissez deux types de données différents à chaque fonction.
SET @thedate = '2010-10-11', @thetime = '12:15:35', @thedatetime = '2010-10-10 00:00:00'; SELECT TIMEDIFF(@thetime, @thedatetime) AS 'TIMEDIFF', TIMESTAMPDIFF(hour, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';
Résultat :
+----------+---------------+ | TIMEDIFF | TIMESTAMPDIFF | +----------+---------------+ | NULL | -24 | +----------+---------------+
Nous pouvons donc voir que TIMESTAMPDIFF()
gère correctement les types de données mixtes (tant qu'il s'agit de date ou de date et d'heure).
Cependant, TIMEDIFF()
nécessite que les deux arguments soient du même type, nous obtenons donc NULL
, même si les deux arguments sont d'un type pris en charge par la fonction (heure et date/heure).
Nous pouvons confirmer que les deux types sont en fait pris en charge par cette fonction avec l'exemple suivant :
SET @thetime1 = '12:15:35', @thetime2 = '10:15:35', @thedatetime1 = '2010-10-12 00:00:00', @thedatetime2 = '2010-10-10 00:00:00'; SELECT TIMEDIFF(@thetime1, @thetime2) AS 'time', TIMEDIFF(@thedatetime1, @thedatetime2) AS 'datetime';
Résultat :
+----------+----------+ | time | datetime | +----------+----------+ | 02:00:00 | 48:00:00 | +----------+----------+
Donc ça va, tant que les deux arguments sont du même type (soit des valeurs d'heure ou de date/heure).