Каков оптимальный способ выбора строк за последние 7 дней?

Как лучше всего выбрать из таблицы только те строки, которые были созданы за последние 7 дней?

В MySQL есть десятки функций времени и даты, и я немного не понимаю, как проще всего это сделать.

Ради этого вопроса предположим, что у вас есть таблица с именем «my_table», и она содержит строку «created_at», которая является DATETIME.

SELECT * FROM my_table WHERE ...

Что бы вы заполнили предложением WHERE?


person Richard Knop    schedule 29.09.2009    source источник
comment
Ну, есть несколько способов сделать это. Но если вы используете язык для построения запроса, это кое-что изменит.   -  person Brandon Hansen    schedule 30.09.2009
comment
@brandon, Не совсем, для этого вам следует использовать базу данных, а не уровень приложения.   -  person Byron Whitlock    schedule 30.09.2009
comment
Так много способов сделать одно и то же. ТАК сообщество Рокс!   -  person Byron Whitlock    schedule 30.09.2009
comment
@Byron: Да, как и MySQL, хотя, как говорит Ричард, вау, какой головокружительный набор функций даты/времени. :-)   -  person T.J. Crowder    schedule 30.09.2009
comment
@Brandon Hansen: на самом деле я использую Zend Framework и его компоненты (Zend_Db_Table, Zend_Db) для создания запросов sql, но это ничего не меняет. Вы можете просто взять объект where и соединить с ним строку типа 'AND field = 5'.   -  person Richard Knop    schedule 30.09.2009


Ответы (4)


WHERE DATEDIFF(NOW(), created_at) <= 7;

Мне это нравится, потому что оно гласит: «Разница в дате между текущим моментом и временем его создания составляет не более 7 (дней)». в моей собственной голове

person Drew    schedule 29.09.2009
comment
Эй, мне это нравится :) Это очень просто и понятно :) - person Richard Knop; 30.09.2009
comment
@Drew .. возможно, я ошибаюсь здесь .. но не будет ли этот запрос сначала преобразовывать все записи created_at, а затем сопоставлять их? Разве это не накладные расходы, а затем выполнение сопоставления наоборот? - person Sabeen Malik; 30.09.2009
comment
@Sab: я подозреваю, что вы правы, особенно если у created_at есть индекс (а он есть, верно, Ричард?). Это, безусловно, усложняет жизнь оптимизатору, но необходимо провести сравнительный анализ, чтобы увидеть, преодолевает ли он это. - person T.J. Crowder; 30.09.2009
comment
Я еще не искал эту функцию, но будьте осторожны, просто говоря, что старше 7 дней, потому что, если это 1 день, многие из этих типов функций возвращают только результаты, которые относятся к последнему 7 * 24 hours, таким образом оставляя любые записи с первого дня ДО 13:00. Вот почему мой ответ использует DATE() вокруг любых ссылок на временные метки. - person Anthony; 30.09.2009
comment
У created_at на самом деле нет индекса, потому что он не очень часто используется, я использую его в предложении where только на одной странице. - person Richard Knop; 30.09.2009
comment
@Anthony: Согласно документам, он использует только часть даты, поэтому он не должен делать то, чего вы опасаетесь. Этот конкретный пакет SQL — это самый чистый способ, которым я могу написать код. Я не уверен, что это лучше для оптимизатора. ^^;; - person Drew; 30.09.2009

...WHERE created_at >= Date_Add(now(), INTERVAL -7 DAY)

Это мой предпочтительный способ, потому что он такой... понятный. Но ADDDATE тоже подойдет (и вы также можете использовать форму INTERVAL для ясности; по умолчанию это дни, поэтому вы видите, что люди опускают ее). Вы не хотите выполнять вычисление created_at и сравнивать его с now(), потому что для этого требуется вычисление created_at в каждой строке (при условии, что MySQL не оптимизирует его), в то время как изменение now() и сравнение с немодифицированный created_at означает, что MySQL выполняет этот бит один раз и использует результат при сравнении со строками, не говоря уже об индексах.

person T.J. Crowder    schedule 29.09.2009
comment
Вау, не могу поверить, что никто не заметил отсутствие подчеркивания в Date_Add. Я... добавил... это. ;-) - person T.J. Crowder; 01.10.2009

...... ГДЕ created_at >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)

надеюсь это поможет

person Sabeen Malik    schedule 29.09.2009

SELECT * FROM my_table WHERE my_table.datefield > sysdate - 7

person erikric    schedule 27.11.2009