MySQL: як отримати різницю між двома часовими позначками в секундах


97

Чи є спосіб я зробити запит в MySQL, який дасть мені різницю між двома часовими позначками в секундах, або мені це потрібно зробити в PHP? І якщо так, то як би я це зробив?

Відповіді:


176

Ви можете використовувати функції TIMEDIFF()та та TIME_TO_SEC()наступним чином:

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)

Ви також можете використовувати UNIX_TIMESTAMP()функцію, запропоновану @Amber в іншій відповіді:

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)

Якщо ви використовуєте TIMESTAMPтип даних, я думаю, що UNIX_TIMESTAMP()рішення було б дещо швидшим, оскільки TIMESTAMPзначення вже зберігаються як ціле число, що представляє кількість секунд з епохи ( Джерело ). Цитування документів :

При UNIX_TIMESTAMP()використанні у TIMESTAMPстовпці функція повертає внутрішнє значення часової позначки безпосередньо, без неявного перетворення “string-to-Unix-timestamp”.

Майте на увазі, що TIMEDIFF() повертає тип данихTIME . TIMEзначення можуть варіюватися від '-838: 59: 59' до '838: 59: 59' (приблизно 34,96 днів)


11
Ви також можете використовувати TIMESTAMPDIFF , який робить це в одній функції - просто встановіть для unitпараметра параметр SECOND.
Майк,

+1 для пояснення продуктивності. Я не використовував UNIX_TIMESTAMP (), оскільки думав, що це займе більше часу.
elcool

51

Як щодо "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


Якщо стовпець дати має іншу форму, ніж РРРР-ММ-ДД, спробуйте зробити це: str_to_date(date_column, '%m/%d/%Y')у функції TIMESTAMPDIFF для стовпця, для якого потрібно виправити форматування.
largerKing

це краща відповідь для мене, оскільки TIME_TO_SECмаксимум на, 3020399тоді як це повертає правильне значення.
billynoah

21
UNIX_TIMESTAMP(ts1) - UNIX_TIMESTAMP(ts2)

Якщо ви хочете різницю без знака, додайте ABS()навколо виразу.

Крім того, ви можете використовувати, TIMEDIFF(ts1, ts2)а потім перетворити результат часу в секунди за допомогою TIME_TO_SEC().


11

Зауважте, що TIMEDIFF()рішення працює лише тоді, коли між datetimesними менше 35 днів ! TIMEDIFF()повертає TIMEтип даних, і максимальне значення для TIME становить 838: 59: 59 годин (= 34,96 днів)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.