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?

The.Anti.9
quelle

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).

Daniel Vassallo
quelle
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

David
quelle
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().

Bernstein
quelle
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).

Energietechnik
quelle