Мне нужно выбрать все строки в моей базе данных, которые были созданы в прошлом месяце.
Например, если текущий месяц - январь, тогда я хочу вернуть все строки, созданные в декабре, если месяц февраль, то я хочу вернуть все строки, созданные в январе. У меня есть date_created
столбец в моей базе данных , которая содержит список дат , созданные в этом формате: 2007-06-05 14:50:17
.
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
between
включает границы .. Он также будет включать текущую дату. Почему / как ограничится вчера ?? Пожалуйста, дополните?current_date
это не сегодня, а случайная дата, полученная от клиента?Вот еще одна альтернатива. Предполагая, что у вас есть индексированное поле
DATE
илиDATETIME
поле типа, при этом следует использовать индекс, поскольку форматированные даты будут преобразованы в тип перед использованием индекса. После этого при просмотре с EXPLAIN вы должны увидетьrange
запрос, а неindex
запрос .SELECT * FROM table WHERE date_created >= DATE_FORMAT( CURRENT_DATE - INTERVAL 1 MONTH, '%Y/%m/01' ) AND date_created < DATE_FORMAT( CURRENT_DATE, '%Y/%m/01' )
источник
STR_TO_DATE
вокруг,DATE_FORMAT
чтобы он всегда имел дело с объектами даты.Если нет будущих дат ...
SELECT * FROM table_name WHERE date_created > (NOW() - INTERVAL 1 MONTH);
Проверено.
источник
В качестве альтернативы ответу Хободаве
SELECT * FROM table WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
Вы можете добиться того же с EXTRACT, используя YEAR_MONTH в качестве единицы, поэтому вам не понадобится AND, например:
SELECT * FROM table WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL 1 MONTH)
источник
YEAR_WEEK
временного интервала , поэтому вам придется вернуться к ответу hobodave, если вам нужны недели вместо месяцев.SELECT * FROM yourtable where DATE_FORMAT(date_created, '%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 month),'%Y-%m')
Это должно вернуть все записи за предыдущий календарный месяц, в отличие от записей за последние 30 или 31 день.
источник
Несмотря на то, что ответ на этот вопрос уже выбран, я считаю, что самым простым запросом будет
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
источник
Это сработало для меня (выбирает все записи, созданные за последний месяц, независимо от дня, когда вы запускаете запрос в этом месяце)
источник
select fields FROM table WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');
этот сможет воспользоваться преимуществом индекса, если ваш date_created проиндексирован, потому что он не применяет никаких функций преобразования к значению поля.
источник
Вот запрос, чтобы получить записи за последний месяц:
SELECT * FROM `tablename` WHERE `datefiled` BETWEEN DATE_SUB( DATE( NOW( ) ) , INTERVAL 1 MONTH ) AND LAST_DAY( DATE_SUB( DATE( NOW( ) ) , INTERVAL 1 MONTH ) )
С уважением - saqib
источник
Альтернатива с одним условием
SELECT * FROM table WHERE YEAR(date_created) * 12 + MONTH(date_created) = YEAR(CURRENT_DATE) * 12 + MONTH(CURRENT_DATE) - 1
источник
SELECT * FROM table WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
источник