MySQL: come ottenere la differenza tra due timestamp in pochi secondi


97

C'è un modo in cui posso fare una query in MySQL che mi dia la differenza tra due timestamp in pochi secondi, o avrei bisogno di farlo in PHP? E se è così, come potrei fare per farlo?

Risposte:


176

È possibile utilizzare TIMEDIFF()le TIME_TO_SEC()funzioni e come segue:

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)

Puoi anche usare la UNIX_TIMESTAMP()funzione suggerita da @Amber in un'altra risposta:

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)

Se stai usando il TIMESTAMPtipo di dati, immagino che la UNIX_TIMESTAMP()soluzione sarebbe leggermente più veloce, poiché i TIMESTAMPvalori sono già memorizzati come un numero intero che rappresenta il numero di secondi dall'epoca ( Fonte ). Citando i documenti :

Quando UNIX_TIMESTAMP()viene utilizzata su una TIMESTAMPcolonna, la funzione restituisce direttamente il valore del timestamp interno, senza conversione implicita da "stringa a timestamp Unix".

Tieni presente che il TIMEDIFF() tipo di dati restituito diTIME . TIMEi valori possono variare da "-838: 59: 59" a "838: 59: 59" (circa 34,96 giorni)


11
Puoi anche usare TIMESTAMPDIFF , che lo fa in una singola funzione: basta impostare il unitparametro su SECOND.
Mike

+1 per la spiegazione delle prestazioni. Non stavo usando UNIX_TIMESTAMP () perché pensavo che ci sarebbe voluto più tempo.
elcool

51

Che ne dici di "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


Se la colonna della data è in un'altra forma diversa da AAAA-MM-GG, prova a farlo: str_to_date(date_column, '%m/%d/%Y')all'interno della funzione TIMESTAMPDIFF per la colonna che richiede la correzione della formattazione.
Greater King

questa è una risposta migliore per me poiché TIME_TO_SECraggiunge il massimo 3020399mentre questo restituisce il valore corretto.
billynoah

21
UNIX_TIMESTAMP(ts1) - UNIX_TIMESTAMP(ts2)

Se vuoi una differenza senza segno, aggiungi un ABS()intorno all'espressione.

In alternativa, puoi usare TIMEDIFF(ts1, ts2)e quindi convertire il risultato temporale in secondi con TIME_TO_SEC().


11

Nota che la TIMEDIFF()soluzione funziona solo quando datetimessono a meno di 35 giorni di distanza! TIMEDIFF()restituisce un TIMEtipo di dati e il valore massimo per TIME è 838: 59: 59 ore (= 34,96 giorni)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.