Preciso selecionar todas as linhas em meu banco de dados que foram criadas no mês passado.
Por exemplo, se o mês atual for janeiro, desejo retornar todas as linhas que foram criadas em dezembro, se o mês for fevereiro, desejo retornar todas as linhas criadas em janeiro. Eu tenho uma date_created
coluna no meu banco de dados que relaciona a data criado neste formato: 2007-06-05 14:50:17
.
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
between
inclui os limites. Incluirá também a data atual. Por que / como será limitado ao ontem ?? Por favor elabore?current_date
não for hoje, mas uma data aleatória fornecida pelo cliente?Aqui está outra alternativa. Supondo que você tenha um campo indexado
DATE
ou deDATETIME
tipo, isso deve usar o índice, pois as datas formatadas serão convertidas por tipo antes de o índice ser usado. Você deve ver umarange
consulta em vez de umaindex
consulta 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' )
fonte
STR_TO_DATE
torno doDATE_FORMAT
para que ele esteja sempre lidando com objetos de data.Se não houver datas futuras ...
SELECT * FROM table_name WHERE date_created > (NOW() - INTERVAL 1 MONTH);
Testado.
fonte
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, portanto, você não precisaria do AND, assim:
SELECT * FROM table WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL 1 MONTH)
fonte
YEAR_WEEK
intervalo temporal , então você terá que voltar à resposta do hobodave se precisar de semanas em vez de meses.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, em oposição aos registros dos últimos 30 ou 31 dias.
fonte
Embora a resposta para esta pergunta já tenha sido selecionada, no entanto, acredito que a consulta mais simples será
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
fonte
Isso funcionou para mim (seleciona todos os registros criados no mês passado, independentemente do dia em que você executa a consulta neste mês)
fonte
select fields FROM table WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');
este poderá tirar proveito de um índice se o seu date_created estiver indexado, pois não aplica nenhuma função de transformação ao valor do campo.
fonte
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
fonte
Alternativa com condição única
SELECT * FROM table WHERE YEAR(date_created) * 12 + MONTH(date_created) = YEAR(CURRENT_DATE) * 12 + MONTH(CURRENT_DATE) - 1
fonte
SELECT * FROM table WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
fonte