Consulta MySQL - Registros entre hoje e últimos 30 dias

122

Desejo retornar todos os registros que foram adicionados ao banco de dados nos últimos 30 dias. Preciso converter a data em mm / dd / aa devido a fins de exibição.

create_date between DATE_FORMAT(curdate(),'%m/%d/%Y') AND (DATE_FORMAT(curdate() - interval 30 day,'%m/%d/%Y')) 

Minha declaração falha ao limitar os registros aos últimos 30 dias - ele seleciona todos os registros.

Alguém pode me apontar na direção certa? Parece que estou perto.

Obrigado e tenham uma ótima semana.

Jason Sweet
fonte

Respostas:

292

Você precisa aplicar DATE_FORMATa SELECTcláusula, não a WHEREcláusula:

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE()

Observe também que CURDATE()retorna apenas a DATEparte da data; portanto, se você armazenar create_datecomo uma DATETIMEcom a parte da hora preenchida, essa consulta não selecionará os registros de hoje.

Nesse caso, você precisará usar NOW:

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
Quassnoi
fonte
A segunda parte desta resposta é muito importante! Eu posso ou não ter tido esse problema e estava coçando a cabeça até voltar a esta resposta.
Tyler Lazenby
@Quassnoi me desculpe. Este parece ser o único problema de preparação do WordPress \ wpdb. Desculpe de novo.
vee
56
SELECT
    *
FROM
    < table_name >
WHERE
    < date_field > BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY)
AND NOW();
Thinkcast
fonte
2
Eu prefiro este método para BETWEEN CURDATE () - INTERVAL 30
Dan
1
@ErmSo posso saber por quê?
magro
3
Não vou mentir - isso foi há 2 anos e não me lembro! Desculpe: P
Dan
1
Não há necessidade de usarDATE_FORMAT(create_date, '%m/%d/%Y')
kazy
@ Dan Eu prefiro torná-lo mais legível, colocando a data anterior entre parênteses: ... WHERE create_date BETWEEN (NOW() - INTERVAL 30 DAY) AND NOW()
Kris Craig
10

DATE_FORMATretorna uma string, então você está usando duas strings em sua BETWEENcláusula, o que não funcionará conforme o esperado.

Em vez disso, converter a data para o formato do SELECTe fazer o BETWEENpara as datas reais. Por exemplo,

SELECT DATE_FORMAT(create_date, '%m/%d/%y') as create_date_formatted
FROM table
WHERE create_date BETWEEN (CURDATE() - INTERVAL 30 DAY) AND CURDATE()
Rich Adams
fonte
9

Você também pode escrever isso no mysql -

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date < DATE_ADD(NOW(), INTERVAL -1 MONTH);

FIXO

Rohit Suthar
fonte
2
Cuidado: apesar dos votos positivos, isso seleciona datas nos próximos 30 dias / mês, e não nos últimos 30 dias!
JonBrave
4
Concordado, deve ser WHERE create_date> DATE_ADD (NOW (), INTERVAL -1 MÊS);
Bhavik P.
6

Para a atividade de data atual e a atividade completa dos 30 dias anteriores, use-a, pois o SYSDATE é variável em um dia no 30º dia anterior não terá os dados completos para esse dia.

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM mytable
WHERE create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND SYSDATE()
onlybymyexerperience
fonte
1

Aqui está uma solução sem usar a curdate()função, esta é uma solução para quem usa TSQLeu acho

SELECT myDate
FROM myTable
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE()
mvirant
fonte