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?
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 colonneTIMESTAMP
, 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éesTIME
.TIME
les valeurs peuvent aller de '-838: 59: 59' à '838: 59: 59' (environ 34,96 jours)
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
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()
.
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)