MySQL: Consulta para obter todas as linhas do mês anterior

Eu preciso selecionar todas as linhas no meu database que foram criadas no mês passado.

Por exemplo, se o mês atual for janeiro, quero retornar todas as linhas criadas em dezembro, se o mês for fevereiro, quero retornar todas as linhas criadas em janeiro. Eu tenho uma coluna date_created no meu database que lista a data criada neste formato: 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) 

Aqui está outra alternativa. Supondo que você tenha um campo de tipo DATE ou DATETIME indexado, isso deve usar o índice, pois as datas formatadas serão convertidas por tipo antes de o índice ser usado. Você deve então ver uma consulta de range vez de uma consulta de index quando visualizada com 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' ) 

Se não houver datas futuras …

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

Testado.

Alternativamente à resposta do hobodave

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

Você poderia conseguir o mesmo com EXTRACT, usando YEAR_MONTH como unidade, assim você não precisaria do AND, da seguinte forma:

 SELECT * FROM table WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL 1 MONTH) 
 SELECT * FROM yourtable where DATE_FORMAT(date_created, '%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 month),'%Y-%m') 

Isso deve retornar todos os registros do mês anterior, ao contrário dos registros dos últimos 30 ou 31 dias.

Embora a resposta para essa pergunta já tenha sido selecionada, acredito que a consulta mais simples será

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

Aqui está a consulta para obter os registros do último mês:

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

Atenciosamente – saqib

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

este será capaz de tirar proveito de um índice se o seu date_created estiver indexado, porque ele não aplica nenhuma function de transformação ao valor do campo.

 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) 

Isso funcionou para mim (seleciona todos os registros criados no mês passado, independentemente do dia em que você executa a consulta este mês)