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

97

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?

Le.Anti.9
la source

Réponses:

176

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 TIMESTAMPtype de données, je suppose que la UNIX_TIMESTAMP()solution serait légèrement plus rapide, car les TIMESTAMPvaleurs 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 une TIMESTAMPcolonne, 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 . TIMEles valeurs peuvent aller de «-838: 59: 59» à «838: 59: 59» (environ 34,96 jours)

Daniel Vassallo
la source
11
Vous pouvez également utiliser TIMESTAMPDIFF , qui le fait en une seule fonction - il suffit de définir le unitparamètre sur SECOND.
Mike
+1 pour l'explication des performances. Je n'utilisais pas UNIX_TIMESTAMP () car je pensais que cela prendrait plus de temps.
elcool
51

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

David
la source
Si votre colonne de date est sous une autre forme que AAAA-MM-JJ, essayez de faire ceci: str_to_date(date_column, '%m/%d/%Y')dans la fonction TIMESTAMPDIFF pour la colonne dont la mise en forme doit être corrigée.
GreaterKing
c'est une meilleure réponse pour moi car il TIME_TO_SECatteint au maximum alors 3020399que cela renvoie la valeur correcte.
billynoah
21
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 du temps en secondes avec TIME_TO_SEC().

ambre
la source
11

Notez que la TIMEDIFF()solution ne fonctionne que lorsque les intervalles datetimessont inférieurs à 35 jours ! TIMEDIFF()renvoie un TIMEtype de données et la valeur maximale pour TIME est 838: 59: 59 heures (= 34,96 jours)

Ingénierie électrique
la source