Como subtrair 30 dias do datetime atual no mysql?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
Como subtrair 30 dias do datetime atual no mysql?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
Respostas:
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.
SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);
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.
NOW()
e ainda o usa em sua resposta. o_O PS: sua consulta retornaria outro resultado, não o OP provavelmente quer
BETWEEN
e >=
são operadores diferentes, sabe? Minha consulta limita o conjunto de resultados para30 days ago AND today
isso everything after 30 days ago
. Assim, tomorrow
os registros não irá corresponder a mina e sua consulta original, mas irá coincidir com a resposta
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
Você também pode usar
select CURDATE()-INTERVAL 30 DAY
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')
Você pode formatar usando o formato de data no SQL.
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
.
interval
destina-se a casos em que você precisa de um componente que não seja o dia.
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?
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).