Czy istnieje sposób, w jaki mogę wykonać zapytanie w MySQL, które da mi różnicę między dwoma znacznikami czasu w sekundach, czy też powinienem to zrobić w PHP? A jeśli tak, jak miałbym się do tego zabrać?
101
Możesz użyć TIMEDIFF()
i TIME_TO_SEC()
funkcji w następujący sposób:
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)
Możesz również użyć UNIX_TIMESTAMP()
funkcji, zgodnie z sugestią @Amber w innej odpowiedzi:
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)
Jeśli używasz TIMESTAMP
typu danych, myślę, że UNIX_TIMESTAMP()
rozwiązanie byłoby nieco szybsze, ponieważ TIMESTAMP
wartości są już przechowywane jako liczby całkowite reprezentujące liczbę sekund od epoki ( Źródło ). Cytując dokumenty :
Gdy
UNIX_TIMESTAMP()
jest używana wTIMESTAMP
kolumnie, funkcja zwraca wartość wewnętrznego znacznika czasu bezpośrednio, bez niejawnej konwersji „string-to-Unix-timestamp”.Pamiętaj, że
TIMEDIFF()
zwracany typ danychTIME
.TIME
wartości mogą wynosić od „-838: 59: 59” do „838: 59: 59” (około 34,96 dni)
unit
parametr naSECOND
.A co z „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
źródło
str_to_date(date_column, '%m/%d/%Y')
w ramach funkcji TIMESTAMPDIFF dla kolumny, która wymaga poprawienia formatowania.TIME_TO_SEC
osiąga maksimum na, podczas3020399
gdy zwraca poprawną wartość.Jeśli chcesz mieć niepodpisaną różnicę, dodaj
ABS()
wokół wyrażenia.Alternatywnie możesz użyć,
TIMEDIFF(ts1, ts2)
a następnie przekonwertować wynik czasu na sekundy za pomocąTIME_TO_SEC()
.źródło
Pamiętaj, że
TIMEDIFF()
rozwiązanie działa tylko wtedy, gdy odstęp między nimidatetimes
jest krótszy niż 35 dni !TIMEDIFF()
zwracaTIME
typ danych, a maksymalna wartość TIME to 838: 59: 59 godzin (= 34,96 dni)źródło