MySQL: jak uzyskać różnicę między dwoma znacznikami czasu w kilka sekund

101

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ć?

The.Anti.9
źródło

Odpowiedzi:

178

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 TIMESTAMPtypu danych, myślę, że UNIX_TIMESTAMP()rozwiązanie byłoby nieco szybsze, ponieważ TIMESTAMPwartoś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 w TIMESTAMPkolumnie, funkcja zwraca wartość wewnętrznego znacznika czasu bezpośrednio, bez niejawnej konwersji „string-to-Unix-timestamp”.

Pamiętaj, że TIMEDIFF() zwracany typ danychTIME . TIMEwartości mogą wynosić od „-838: 59: 59” do „838: 59: 59” (około 34,96 dni)

Daniel Vassallo
źródło
13
Możesz również użyć TIMESTAMPDIFF , który robi to w jednej funkcji - po prostu ustaw unitparametr na SECOND.
Mike,
+1 za wyjaśnienie wydajności. Nie używałem UNIX_TIMESTAMP (), ponieważ myślałem, że zajmie to więcej czasu.
elcool
55

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

David
źródło
Jeśli kolumna daty ma inną formę niż RRRR-MM-DD, spróbuj zrobić to: str_to_date(date_column, '%m/%d/%Y')w ramach funkcji TIMESTAMPDIFF dla kolumny, która wymaga poprawienia formatowania.
GreaterKing
jest to dla mnie lepsza odpowiedź, ponieważ TIME_TO_SECosiąga maksimum na, podczas 3020399gdy zwraca poprawną wartość.
billynoah
21
UNIX_TIMESTAMP(ts1) - UNIX_TIMESTAMP(ts2)

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

Bursztyn
źródło
11

Pamiętaj, że TIMEDIFF()rozwiązanie działa tylko wtedy, gdy odstęp między nimi datetimesjest krótszy niż 35 dni ! TIMEDIFF()zwraca TIMEtyp danych, a maksymalna wartość TIME to 838: 59: 59 godzin (= 34,96 dni)

Inżynieria energetyczna
źródło