Como subtrair 30 dias do datetime atual no mysql?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
SELECT * FROM table
WHERE exec_datetime BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW();
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add
Para quem não quiser usar DATE_SUB
, use CURRENT_DATE
:
SELECT CURRENT_DATE - INTERVAL 30 DAY
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.current_timestamp
vez decurrent_date
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.Você pode usar
BETWEEN
se 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.fonte
NOW()
e ainda o usa em sua resposta. o_O PS: sua consulta retornaria outro resultado, não o OP provavelmente querBETWEEN
e>=
são operadores diferentes, sabe? Minha consulta limita o conjunto de resultados para30 days ago AND today
issoeverything after 30 days ago
. Assim,tomorrow
os registros não irá corresponder a mina e sua consulta original, mas irá coincidir com a respostaO MySQL subtrai dias a partir de agora:
Impressões:
Outros argumentos da unidade de expressão temporal de intervalo:
https://dev.mysql.com/doc/refman/5.5/en/expressions.html#temporal-intervals
fonte
Você também pode usar
fonte
Você pode formatar usando o formato de data no SQL.
fonte
outra maneira
fonte
Se você precisar apenas da data e não da hora, use:
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 usarinterval
.interval
destina-se a casos em que você precisa de um componente que não seja o dia.fonte
subdate(curdate(), 30)
é mais rápido do queCURRENT_DATE - INTERVAL 30 DAY
? Você tem provas? E quão rápido isso seria? Alguns microssegundos?subdate
ser 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"?curdate()
pode ser realmente a escolha errada, porque o OP parecia querer "subtrair 30 dias da data e hora atuais " (grifo meu).