Existe-t-il un moyen de faire une requête dans MySQL qui me donnera la différence entre deux horodatages en quelques secondes, ou aurais-je besoin de le faire en PHP? Et si oui, comment pourrais-je procéder?
Vous pouvez utiliser TIMEDIFF()
les TIME_TO_SEC()
fonctions et 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 UNIX_TIMESTAMP()
fonction comme @Amber 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 la UNIX_TIMESTAMP()
solution serait légèrement plus rapide, car les TIMESTAMP
valeurs sont déjà stockées sous forme d'entier représentant le nombre de secondes depuis l'époque ( Source ). Citant les documents :
Lorsqu'elle
UNIX_TIMESTAMP()
est utilisée sur uneTIMESTAMP
colonne, la fonction renvoie directement la valeur d'horodatage interne, sans conversion implicite «chaîne en horodatage Unix».Gardez à l'esprit que
TIMEDIFF()
le type de données de retourTIME
.TIME
les valeurs peuvent aller de «-838: 59: 59» à «838: 59: 59» (environ 34,96 jours)
unit
paramètre surSECOND
.Que diriez-vous de "TIMESTAMPDIFF":
https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timestampdiff
la source
str_to_date(date_column, '%m/%d/%Y')
dans la fonction TIMESTAMPDIFF pour la colonne dont la mise en forme doit être corrigée.TIME_TO_SEC
atteint au maximum alors3020399
que cela renvoie la valeur correcte.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 du temps en secondes avecTIME_TO_SEC()
.la source
Notez que la
TIMEDIFF()
solution ne fonctionne que lorsque les intervallesdatetimes
sont inférieurs à 35 jours !TIMEDIFF()
renvoie unTIME
type de données et la valeur maximale pour TIME est 838: 59: 59 heures (= 34,96 jours)la source