Ответ 1
SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
Мне нужно выбрать все строки в моей базе данных, созданные в прошлом месяце.
Например, если текущий месяц - январь, тогда я хочу вернуть все строки, которые были созданы в декабре, если месяц февраль, тогда я хочу вернуть все строки, созданные в январе. У меня есть столбец date_created
в моей базе данных, который содержит дату, созданную в этом формате: 2007-06-05 14:50:17
.
SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
Вот еще одна альтернатива. Предполагая, что у вас есть индексированное поле типа DATE
или DATETIME
, это должно использовать индекс, поскольку форматированные даты будут преобразованы в тип перед использованием индекса. Затем вы должны увидеть запрос range
, а не запрос index
при просмотре EXPLAIN.
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' )
Если нет будущих дат...
SELECT *
FROM table_name
WHERE date_created > (NOW() - INTERVAL 1 MONTH);
Испытано.
Альтернативно hobodave answer
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)
Вот запрос, чтобы получить записи за последний месяц:
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 fields FROM table
WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');
этот сможет воспользоваться индексом, если индексируется index_created, поскольку он не применяет какую-либо функцию преобразования к значению поля.
Несмотря на то, что ответ на этот вопрос уже выбран, однако, я считаю, что самый простой запрос будет
SELECT *
FROM table
WHERE
date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
WHERE created_date >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY)
AND created_date <= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)), INTERVAL 0 DAY)
Это сработало для меня (выбирает все записи, созданные за последний месяц, независимо от того дня, в который вы запустили запрос в этом месяце)
выберите * Из таблицы где DATE_FORMAT (date_created, '% Y-% m') = date_format (DATE_SUB (curdate(), INTERVAL 1 месяц), '% Y-% m')