MySQL: запрос, чтобы получить все строки из предыдущего месяца

Мне нужно выбрать все строки в моей базе данных, созданные в прошлом месяце.

Например, если текущий месяц - январь, тогда я хочу вернуть все строки, которые были созданы в декабре, если месяц февраль, тогда я хочу вернуть все строки, созданные в январе. У меня есть столбец date_created в моей базе данных, который содержит дату, созданную в этом формате: 2007-06-05 14:50:17.

Ответ 1

SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)

Ответ 2

Вот еще одна альтернатива. Предполагая, что у вас есть индексированное поле типа 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' )

Ответ 3

Если нет будущих дат...

SELECT * 
FROM   table_name 
WHERE  date_created > (NOW() - INTERVAL 1 MONTH);

Испытано.

Ответ 4

Альтернативно 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)

Ответ 5

Вот запрос, чтобы получить записи за последний месяц:

SELECT *
FROM `tablename`
WHERE `datefiled`
BETWEEN DATE_SUB( DATE( NOW( ) ) , INTERVAL 1
MONTH )
AND 
LAST_DAY( DATE_SUB( DATE( NOW( ) ) , INTERVAL 1
MONTH ) )

Отношения - saqib

Ответ 6

select fields FROM table WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');

этот сможет воспользоваться индексом, если индексируется index_created, поскольку он не применяет какую-либо функцию преобразования к значению поля.

Ответ 7

Несмотря на то, что ответ на этот вопрос уже выбран, однако, я считаю, что самый простой запрос будет

SELECT * 
FROM table 
WHERE 
date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();

Ответ 8

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) 

Это сработало для меня (выбирает все записи, созданные за последний месяц, независимо от того дня, в который вы запустили запрос в этом месяце)

Ответ 9

выберите * Из таблицы где DATE_FORMAT (date_created, '% Y-% m') = date_format (DATE_SUB (curdate(), INTERVAL 1 месяц), '% Y-% m')