¿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();
¿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();
Respuestas:
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 cualquiera que no quiera usar DATE_SUB
, use CURRENT_DATE
:
SELECT CURRENT_DATE - INTERVAL 30 DAY
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.
current_timestamp
lugar decurrent_date
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 BETWEEN
si 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.
NOW()
y aún lo usa en su respuesta. o_O PS: su consulta devolverá otro resultado, no lo que OP probablemente quiere
BETWEEN
y >=
son diferentes operadores, ¿sabes? Mi consulta limita el conjunto de resultados para 30 days ago AND today
esto everything after 30 days ago
. Por lo tanto, los tomorrow
registros no coincidirán con los míos y su consulta original, pero coincidirán con esta respuesta
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
También puedes usar
select CURDATE()-INTERVAL 30 DAY
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')
Puede formatear usando el formato de fecha en SQL.
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
.
interval
está destinado a ser para casos en los que necesita un componente que no sea de día.
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?
subdate
ser 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"?
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).