MySQL: So ermitteln Sie die Differenz zwischen zwei Zeitstempeln in Sekunden


97

Gibt es eine Möglichkeit, eine Abfrage in MySQL durchzuführen, die mir den Unterschied zwischen zwei Zeitstempeln in Sekunden gibt, oder müsste ich dies in PHP tun? Und wenn ja, wie würde ich das machen?

Antworten:


175

Sie können die TIMEDIFF()und die TIME_TO_SEC()Funktionen wie folgt verwenden:

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)

Sie können die UNIX_TIMESTAMP()Funktion auch so verwenden , wie @Amber in einer anderen Antwort vorgeschlagen hat:

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)

Wenn Sie den TIMESTAMPDatentyp verwenden, ist die UNIX_TIMESTAMP()Lösung wahrscheinlich etwas schneller, da die TIMESTAMPWerte bereits als Ganzzahl gespeichert sind, die die Anzahl der Sekunden seit der Epoche ( Quelle ) darstellt. Zitieren der Dokumente :

Bei UNIX_TIMESTAMP()Verwendung in einer TIMESTAMPSpalte gibt die Funktion den internen Zeitstempelwert direkt zurück, ohne implizite Konvertierung von Zeichenfolgen in Unix-Zeitstempel.

Beachten Sie, dass der TIMEDIFF() Datentyp von zurückgegeben wirdTIME . TIMEDie Werte können zwischen '-838: 59: 59' und '838: 59: 59' liegen (ungefähr 34,96 Tage).


11
Sie können auch TIMESTAMPDIFF verwenden , das dies in einer einzigen Funktion erledigt - setzen Sie einfach den unitParameter auf SECOND.
Mike

+1 für die Leistungserklärung. Ich habe UNIX_TIMESTAMP () nicht verwendet, weil ich dachte, es würde länger dauern.
Elcool

51

Wie wäre es mit "TIMESTAMPDIFF":

SELECT TIMESTAMPDIFF(SECOND,'2009-05-18','2009-07-29') from `post_statistics`

https://dev.mysql.com/doc/refman/5.7/de/date-and-time-functions.html#function_timestampdiff


Wenn sich Ihre str_to_date(date_column, '%m/%d/%Y')Datumsspalte in einer anderen Form als JJJJ-MM-TT befindet, versuchen Sie Folgendes : Innerhalb der TIMESTAMPDIFF-Funktion für die Spalte, deren Formatierung korrigiert werden muss.
GreaterKing

Dies ist eine bessere Antwort für mich, da das TIME_TO_SECMaximum bei liegt, 3020399während dies den korrekten Wert zurückgibt.
Billynoah

21
UNIX_TIMESTAMP(ts1) - UNIX_TIMESTAMP(ts2)

Wenn Sie einen vorzeichenlosen Unterschied wünschen, fügen Sie einen ABS()um den Ausdruck herum hinzu.

Alternativ können Sie das Zeitergebnis mit verwenden TIMEDIFF(ts1, ts2)und dann in Sekunden umwandeln TIME_TO_SEC().


11

Beachten Sie, dass die TIMEDIFF()Lösung funktioniert nur , wenn das datetimessind weniger als 35 Tage auseinander! TIMEDIFF()Gibt einen TIMEDatentyp zurück und der Maximalwert für TIME beträgt 838: 59: 59 Stunden (= 34,96 Tage).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.