Como subtrair 30 dias da data e hora atuais no mysql?

194

Como subtrair 30 dias do datetime atual no mysql?

SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
user784637
fonte

Respostas:

127

Para quem não quiser usar DATE_SUB, use CURRENT_DATE:

SELECT CURRENT_DATE - INTERVAL 30 DAY
Doug Fir
fonte
2
Eu daria +10 se pudesse. O SQL deve ter tudo a ver com legibilidade e esta é a maneira mais legível de fazer isso.
Colin 't Hart
9
Resultado mais legível, mas diferente do que o uso NOW() - INTERVAL 30 DAY. Como a pergunta menciona "subtrair 30 dias da data e hora atuais ", pode não ser o que o OP deseja.
precisa saber é o seguinte
2
@ ypercubeᵀᴹ então use em current_timestampvez decurrent_date
isapir
21

Não vamos usar, NOW()pois você está perdendo qualquer cache ou otimização de consulta, porque a consulta é sempre diferente. Veja a lista de funções que você não deve usar na documentação do MySQL. .

No código abaixo, vamos assumir que esta tabela está crescendo com o tempo. Novos itens foram adicionados e você deseja mostrar apenas os últimos 30 dias. Este é o caso mais comum.

Observe que a data foi adicionada como uma sequência. É melhor adicionar a data dessa maneira, a partir do seu código de chamada, do que usar a NOW()função, pois isso mata o cache.

SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);

Você pode usar BETWEENse você realmente quiser coisas desse mesmo segundo a 30 dias antes desse mesmo segundo, mas esse não é um caso de uso comum em minha experiência, portanto, espero que a consulta simplificada possa atendê-lo bem.

Joseph Lust
fonte
3
Então você propôs não usar NOW()e ainda o usa em sua resposta. o_O PS: sua consulta retornaria outro resultado, não o OP provavelmente quer
zerkms
@zerkms Como essa consulta produziria um conjunto de resultados diferente da sua consulta?
User784637
2
@ user784637: uhm, BETWEENe >=são operadores diferentes, sabe? Minha consulta limita o conjunto de resultados para30 days ago AND today isso everything after 30 days ago. Assim, tomorrowos registros não irá corresponder a mina e sua consulta original, mas irá coincidir com a resposta
zerkms
Ok, meu mal. Normalmente, essas consultas estão em tabelas ativas que estão crescendo com o tempo. É por isso que eu larguei o meio. Esclareci minha resposta acima.
Joseph Lust
@ Josephphust, Para resolver problemas de desempenho, use minha solução .
Pacerier
17

O MySQL subtrai dias a partir de agora:

select now(), now() - interval 1 day

Impressões:

2014-10-08 09:00:56     2014-10-07 09:00:56

Outros argumentos da unidade de expressão temporal de intervalo:

https://dev.mysql.com/doc/refman/5.5/en/expressions.html#temporal-intervals

select now() - interval 1 microsecond 
select now() - interval 1 second 
select now() - interval 1 minute 
select now() - interval 1 hour 
select now() - interval 1 day 
select now() - interval 1 week 
select now() - interval 1 month 
select now() - interval 1 year 
Eric Leschinski
fonte
16

Você também pode usar

select CURDATE()-INTERVAL 30 DAY
Noby Nirmal
fonte
1
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')

Você pode formatar usando o formato de data no SQL.

Varaj Vignesh
fonte
0

outra maneira

SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;
zzapper
fonte
0

Se você precisar apenas da data e não da hora, use:

select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();

Como curdate()omite o componente de tempo, é potencialmente mais rápido quenow() e "semanticamente correto" nos casos em que você está interessado apenas na data.

Além disso, subdate()a sobrecarga de duas áreas é potencialmente mais rápida do que usar interval. intervaldestina-se a casos em que você precisa de um componente que não seja o dia.

Pacerier
fonte
11
Então, você está afirmando que subdate(curdate(), 30)é mais rápido do que CURRENT_DATE - INTERVAL 30 DAY? Você tem provas? E quão rápido isso seria? Alguns microssegundos?
precisa saber é o seguinte
2
Eu não faço ideia. Certamente não posso votar novamente em meus próprios comentários. Sobre a afirmação "potencialmente mais rápida", ainda não vejo provas, decisivas ou circunstanciais. E mesmo que seja um pouco mais rápido, a condição seria avaliada uma vez. A menos que você execute a consulta milhões de vezes por minuto, a diferença não importa.
precisa saber é o seguinte
2
Suponho que subdateser potencialmente mais rápido provavelmente seja, de alguma forma, explicado, na sua opinião, por sua "sobrecarga de duas aridades", mas, por favor, perdoe-me se essa é uma pergunta estúpida, o que essas palavras significam (com relação a uma função )? Particularmente, o que é "2-arity"?
Andriy M
1
Além disso, na redação da pergunta, curdate()pode ser realmente a escolha errada, porque o OP parecia querer "subtrair 30 dias da data e hora atuais " (grifo meu).
187 Andriy M
1
@AndriyM, bem, como esse tópico está obtendo 50 mil visualizações, deixarei a resposta aqui para pessoas interessadas apenas no componente de tempo. E em relação à "aridade", refere-se ao número de argumentos . Sim, está correto, pois, apesar de todas as coisas serem iguais, uma função de 2 aridades é potencialmente mais rápida que a de 3 aridades. Isso permanecerá verdadeiro até que novas informações sejam adicionadas ao prato.
Pacerier