130 votes

MySQL : comment obtenir la différence entre deux timestamps en secondes

Existe-t-il un moyen de faire une requête dans MySQL qui me donne la différence entre deux horodatages en secondes, ou dois-je le faire en PHP ? Et si c'est le cas, comment dois-je m'y prendre ?

222voto

Daniel Vassallo Points 142049

Vous pourriez utiliser le TIMEDIFF() et le TIME_TO_SEC() fonctionne 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 le UNIX_TIMESTAMP() fonction comme @Amber a 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 TIMESTAMP type de données, je suppose que le UNIX_TIMESTAMP() serait légèrement plus rapide, puisque TIMESTAMP sont déjà stockées sous la forme d'un nombre entier représentant le nombre de secondes depuis l'époque ( Source : ). Citant le docs :

Cuando UNIX_TIMESTAMP() est utilisé sur un TIMESTAMP la fonction renvoie directement la valeur de l'horodatage interne, sans conversion implicite "string-to-Unix-timestamp".

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

73voto

Wan Liqun Points 702

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

24voto

Amber Points 159296
UNIX_TIMESTAMP(ts1) - UNIX_TIMESTAMP(ts2)

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

Alternativement, vous pouvez utiliser TIMEDIFF(ts1, ts2) et ensuite convertir le résultat en secondes avec TIME_TO_SEC() .

17voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X