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

100

Есть ли способ сделать запрос в MySQL, который даст мне разницу между двумя отметками времени в секундах, или мне нужно будет сделать это в PHP? И если да, то как я могу это сделать?

The.Anti.9
источник

Ответы:

177

Можно использовать 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столбце функция возвращает значение внутренней метки времени напрямую, без неявного преобразования «строка в метку времени Unix».

Имейте в виду, что TIMEDIFF() возвращаемый тип данныхTIME . TIMEзначения могут варьироваться от -838: 59: 59 до 838: 59: 59 (примерно 34,96 дня).

Даниэль Вассалло
источник
11
Вы также можете использовать TIMESTAMPDIFF , который делает это в одной функции - просто установите для unitпараметра значение SECOND.
Майк
+1 за объяснение производительности. Я не использовал UNIX_TIMESTAMP (), потому что думал, что это займет больше времени.
elcool
52

Как насчет "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

Дэвид
источник
Если ваш столбец даты находится в другой форме, отличной от YYYY-MM-DD, попробуйте сделать это: str_to_date(date_column, '%m/%d/%Y')в функции TIMESTAMPDIFF для столбца, который нуждается в исправлении форматирования.
greatKing
это лучший ответ для меня, поскольку он 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 дней)

Энергетика
источник