MySQL - возвращать только записи за последние X дней

Я работаю с базой данных, в которой информация о дате хранится в виде временной метки Unix ( int(11) ), и я хочу возвращать только записи за последние X дней, например, за последние 90 дней.

Что я придумал:

SELECT * FROM mytable WHERE category=1 AND 
FROM_UNIXTIME( time ) > DATE_SUB(now(), INTERVAL 91 DAY)

Где «время» - это int (11) в базе данных. Кажется, это работает нормально, но просто интересно, что другие думают об этом.


person Community    schedule 23.08.2009    source источник


Ответы (4)


SELECT * FROM mytable WHERE category=1 AND 
time > (UNIX_TIMESTAMP() - ((60*60*24)*90))

или просто

SELECT * FROM mytable WHERE category=1 AND time > (UNIX_TIMESTAMP() - (86400*90))

это просто сравнение числа (в данном случае секунд)

person Question Mark    schedule 23.08.2009
comment
Спасибо, только что попробовал, вроде работает нормально. - person ; 23.08.2009
comment
Работает также быстрее, вы можете использовать индекс для time, что невозможно в вашем случае (потому что вы сравниваете функцию времени, а не само время). Но! У него есть большая проблема с такими очень странными человеческими увлечениями, как переход на летнее время. Это, должно быть, стоило много миллиардов долларов в ИТ с течением времени... - person flaschenpost; 12.05.2013

Этот запрос обязательно вызовет у вас головную боль в будущем, поскольку MySQL должен выполнять преобразование дат для каждой строки, что делает невозможным использование индексов. Временные метки Unix — это числа, поэтому вместо преобразования временной метки в другой формат даты преобразуйте даты поиска в временные метки unix.

person code_burgar    schedule 23.08.2009
comment
Мои тестовые запросы выполняются в районе 0,0046 секунды. И мой первоначальный запрос, и запрос из первого ответа выше, на самом деле не имеют большой разницы с точки зрения времени. - person ; 23.08.2009
comment
Я уверен, что да, но попробуйте загрузить в таблицу 100-500 тысяч тестовых записей, а затем проверьте время выполнения. Кроме того, 0,0046 может быть временем выполнения кэшированного запроса, если у вас больше нескольких строк, попробуйте изменить некоторые параметры и перезапустить запрос. - person code_burgar; 23.08.2009
comment
Мой тестовый запрос был SELECT *, я просто изменил его на несколько случайных столбцов, и он выполнился за 0,0044 секунды. Я изменил запрос на год назад (в тех же случайных столбцах), он вернул 599 записей за 0,0025 с — самый быстрый запрос. К сожалению, у меня нет никаких тестовых записей, только записи, которые есть в БД (но они довольно большие). - person ; 23.08.2009

В чем причина хранения метки времени как int ? Я бы использовал тип данных mysql DATETIME, потому что вы можете использовать многие функции Date Time mysql имеет.

Если у вас нет контроля над типом данных этого поля, я бы преобразовал вашу дату в метку времени unix int, прежде чем вы сделаете свой запрос и сравните ее таким образом.

person Mark    schedule 23.08.2009
comment
Это то, как это было сделано, и мне неудобно менять это на данный момент. Запросы выполняются в районе 0,0046 секунды, так что это не проблема производительности? - person ; 23.08.2009

Просто подумав вслух ... не будет ли наоборот меньше работы для БД?

time > UNIX_TIMESTAMP( DATE_SUB(NOW(), INTERVAL 91 DAY) )
person Zed    schedule 23.08.2009
comment
TO_UNIXTIME, по-видимому, не существует в моей версии mysql :) - person ; 23.08.2009
comment
То есть даже летнее время - экономьте. - person flaschenpost; 12.05.2013