Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Richard KnopОтветов: 4

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

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

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

SELECT * FROM my_table WHERE ...

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

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

sqldatetime

Ответы

Ответ 1 · рейтинг 14 · Drew

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

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

Ответ 2 · рейтинг 12 · T.J. Crowder

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

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

Ответ 3 · рейтинг 4 · Sabeen Malik

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

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

Ответ 4 · рейтинг 1 · erikric

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы