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


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

SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
 140
Author: user784637, 2012-05-26

8 answers

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

 216
Author: zerkms,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-26 01:50:51

Para cualquiera que no quiera usar DATE_SUB, use CURRENT_DATE:

SELECT CURRENT_DATE - INTERVAL 30 DAY
 92
Author: Doug Fir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-13 01:53:19

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

En el siguiente código, asumamos 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 añadido como una cadena. Es mejor agregar la fecha de esta manera, desde su llamar al código, que usar la función NOW() ya que mata su almacenamiento en caché.

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

Puede usar BETWEEN si realmente solo desea cosas desde este mismo 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 le pueda servir bien.

 18
Author: Joseph Lust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-13 03:31:49

También puedes usar

select CURDATE()-INTERVAL 30 DAY
 10
Author: Noby Nirmal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-23 06:39:07

MySQL resta días a partir de ahora:

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

Impresiones:

2014-10-08 09:00:56     2014-10-07 09:00:56
 7
Author: Eric Leschinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-08 13:04:03
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')

Puede formatear usando el formato de fecha en SQL.

 1
Author: Varaj Vignesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-31 07:03:51

Otra manera

SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;
 0
Author: zzapper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-18 15:36:34

Si solo necesita la fecha y no el uso de la hora:

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

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

Además, la sobrecarga de 2 aridades de subdate() es potencialmente más rápida que usar interval. interval está destinado a ser para casos en los que se necesita un componente no diurno.

 -1
Author: Pacerier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:48