web-dev-qa-db-fra.com

MySQL: comment faire la différence entre deux horodatages en quelques secondes

Est-il possible de faire une requête dans MySQL qui me donne la différence entre deux horodatages en quelques secondes, ou aurais-je besoin de le faire en PHP? Et si oui, comment pourrais-je m'y prendre?

84
The.Anti.9

Vous pouvez utiliser les fonctions TIMEDIFF() et les fonctions TIME_TO_SEC() comme suit:

SELECT TIME_TO_SEC(TIMEDIFF('2010-08-20 12:01:00', '2010-08-20 12:00:00')) diff;
+------+
| diff |
+------+
|   60 |
+------+
1 row in set (0.00 sec)

Vous pouvez également utiliser la fonction UNIX_TIMESTAMP() comme @ Ambre suggéré dans une autre réponse:

SELECT UNIX_TIMESTAMP('2010-08-20 12:01:00') - 
       UNIX_TIMESTAMP('2010-08-20 12:00:00') diff;
+------+
| diff |
+------+
|   60 |
+------+
1 row in set (0.00 sec)

Si vous utilisez le type de données TIMESTAMP, je suppose que la solution UNIX_TIMESTAMP() sera un peu plus rapide, car les valeurs de TIMESTAMP sont déjà stockées sous la forme d'un entier représentant le nombre de secondes depuis l'époque ( Source ). Citant le docs :

Lorsque UNIX_TIMESTAMP() est utilisé sur une colonne TIMESTAMP, la fonction renvoie directement la valeur de l'horodatage interne, sans conversion implicite "chaîne vers timbre-temps Unix".

Gardez à l'esprit que TIMEDIFF()retourne le type de données TIME . TIME les valeurs peuvent aller de '-838: 59: 59' à '838: 59: 59' (environ 34,96 jours)

149
Daniel Vassallo

Que diriez-vous de "TIMESTAMPDIFF":

SELECT TIMESTAMPDIFF(SECOND,'2009-05-18','2009-07-29') from `post_statistics`

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampdiff

41
David
UNIX_TIMESTAMP(ts1) - UNIX_TIMESTAMP(ts2)

Si vous voulez une différence non signée, ajoutez un ABS() autour de l'expression.

Vous pouvez également utiliser TIMEDIFF(ts1, ts2), puis convertir le résultat temporel en secondes avec TIME_TO_SEC().

19
Amber

Notez que la solution TIMEDIFF() ne fonctionne que lorsque les datetimes sont moins de 35 jours à part! TIMEDIFF() renvoie un type de données TIME, et le la valeur maximale pour TIME est 838: 59: 59 heures (= 34,96 jours)

9