¿Cómo restar 30 días de la fecha y hora actual en mysql?

194

¿Cómo restar 30 días de la fecha y hora actual en mysql?

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

Respuestas:

127

Para cualquiera que no quiera usar DATE_SUB, use CURRENT_DATE:

SELECT CURRENT_DATE - INTERVAL 30 DAY
Doug Fir
fuente
2
Daría este +10 si pudiera. SQL debería ser todo acerca de la legibilidad y esta es la forma más legible de hacerlo.
Colin 't Hart
9
Resultado más legible pero diferente al uso NOW() - INTERVAL 30 DAY. Como la pregunta menciona "restar 30 días de la fecha y hora actual ", puede que no sea lo que quiere el OP.
ypercubeᵀᴹ
2
@ ypercubeᵀᴹ luego use en current_timestamplugar decurrent_date
isapir
21

No lo usemos NOW()ya que está perdiendo el almacenamiento en caché u optimización de consultas porque la consulta es diferente cada vez. Consulte la lista de funciones que no debe usar en la documentación de MySQL .

En el siguiente código, supongamos que esta tabla está creciendo con el tiempo. Se agregan cosas nuevas y desea mostrar solo las cosas en los últimos 30 días. Este es el caso más común.

Tenga en cuenta que la fecha se ha agregado como una cadena. Es mejor agregar la fecha de esta manera, desde su código de llamada, que usar la NOW()función ya que mata su almacenamiento en caché.

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

Puedes usarlo BETWEENsi realmente solo quieres cosas desde este segundo hasta 30 días antes de este mismo segundo, pero ese no es un caso de uso común en mi experiencia, así que espero que la consulta simplificada pueda servirte bien.

Joseph Lust
fuente
3
Por lo tanto, propuso no usarlo NOW()y aún lo usa en su respuesta. o_O PS: su consulta devolverá otro resultado, no lo que OP probablemente quiere
zerkms
@zerkms ¿Cómo produciría esta consulta un conjunto de resultados diferente al de su consulta?
user784637
2
@ user784637: uhm, BETWEENy >=son diferentes operadores, ¿sabes? Mi consulta limita el conjunto de resultados para 30 days ago AND todayesto everything after 30 days ago. Por lo tanto, los tomorrowregistros no coincidirán con los míos y su consulta original, pero coincidirán con esta respuesta
zerkms
Ok, mi mal Por lo general, estas consultas se encuentran en tablas activas que crecen con el tiempo. Por eso dejé caer el intermedio. He aclarado mi respuesta anterior.
Joseph Lust
@JosephLust, para resolver problemas de rendimiento, use mi solución en su lugar.
Pacerier
17

MySQL resta días a partir de ahora:

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

Huellas dactilares:

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

Otros argumentos de la Unidad de expresión 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
fuente
16

También puedes usar

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

Puede formatear usando el formato de fecha en SQL.

Varaj Vignesh
fuente
0

de otra manera

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

Si solo necesita la fecha y no la hora, use:

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

Como curdate()omite el componente de tiempo, es potencialmente más rápido now()y más "semánticamente correcto" en los casos en que solo le interesa la fecha.

Además, subdate()la sobrecarga de 2 aridades es potencialmente más rápida que el uso interval. intervalestá destinado a ser para casos en los que necesita un componente que no sea de día.

Pacerier
fuente
11
Entonces, ¿estás afirmando que subdate(curdate(), 30)es más rápido que CURRENT_DATE - INTERVAL 30 DAY? ¿Tienes prueba? ¿Y qué tan rápido sería eso? ¿Unos microsegundos?
ypercubeᵀᴹ
2
No tengo idea. Ciertamente no puedo votar mis propios comentarios. Sobre el reclamo "potencialmente" más rápido, todavía no veo ninguna prueba, decisiva o circunstancial. E incluso si es algo más rápido, la condición se evaluaría una vez. A menos que ejecute la consulta millones de veces por minuto, la diferencia no importará.
ypercubeᵀᴹ
2
Supongo que subdateser potencialmente más rápido probablemente se explique de alguna manera, en su opinión, por su "sobrecarga de 2 aridades", pero, por favor, perdóneme si esta es una pregunta estúpida, ¿qué significan esas palabras (con respecto a una función )? En particular, ¿qué es "2-arity"?
Andriy M
1
Además, en cuanto a la redacción de la pregunta, en curdate()realidad puede ser la elección incorrecta, porque el OP parecía querer "restar 30 días de la fecha y hora actual " (énfasis mío).
Andriy M
1
@AndriyM, Bueno, dado que este hilo está obteniendo 50k vistas, dejaré la respuesta aquí para las personas que están interesadas solo en el componente de tiempo. Y con respecto al "arity", se refiere al número de argumentos . Sí, eso es correcto, en igualdad de condiciones, una función de 2 aridades es potencialmente más rápida que una de 3 aridades. Eso será válido hasta que se agregue nueva información a la placa.
Pacerier