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


100

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

Ответы:


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 дней)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.