Consulta MySQL-Registros entre Hoy y los Últimos 30 Días


Quiero devolver todos los registros que se agregaron a la base de datos en los últimos 30 días. Necesito convertir la fecha a mm / dd / aa debido a los propósitos de visualización.

create_date between DATE_FORMAT(curdate(),'%m/%d/%Y') AND (DATE_FORMAT(curdate() - interval 30 day,'%m/%d/%Y')) 

Mi declaración no limita los registros a los últimos 30 días - selecciona todos los registros.

¿Puede alguien señalarme en la dirección correcta? Parece que estoy cerca.

Gracias y que tengan una gran semana.

Author: Vldb.User, 2010-01-11

6 answers

Necesitas aplicar DATE_FORMAT en la cláusula SELECT, no en la cláusula WHERE:

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE()

También tenga en cuenta que CURDATE() devuelve solo la porción DATE de la fecha, por lo que si almacena create_date como DATETIME con la porción de tiempo completada, esta consulta no seleccionará los registros de hoy.

En este caso, necesitarás usar NOW en su lugar:

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
 229
Author: Quassnoi,
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
2013-12-27 10:11:18
SELECT
    *
FROM
    < table_name >
WHERE
    < date_field > BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY)
AND NOW();
 48
Author: Thinkcast,
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-02-01 11:02:27

DATE_FORMAT devuelve una cadena, por lo que está utilizando dos cadenas en su cláusula BETWEEN, que no va a funcionar como espera.

En su lugar, convierta la fecha a su formato en el SELECT y haga el BETWEEN para las fechas reales. Por ejemplo,

SELECT DATE_FORMAT(create_date, '%m/%d/%y') as create_date_formatted
FROM table
WHERE create_date BETWEEN (CURDATE() - INTERVAL 30 DAY) AND CURDATE()
 10
Author: Rich Adams,
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
2011-10-21 06:45:41

También puede escribir esto en mysql -

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date < DATE_ADD(NOW(), INTERVAL +1 MONTH);
 8
Author: Rohit Suthar,
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-06-25 05:50:47

Para la actividad de fecha actual y la actividad completa para los 30 días anteriores use esto, ya que el SYSDATE es variable en un día el día 30 anterior no tendrá los datos completos para ese día.

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM mytable
WHERE create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND SYSDATE()
 6
Author: onlybymyexerperience,
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
2011-12-02 22:59:09

Aquí hay una solución sin usar la función curdate(), esta es una solución para aquellos que usan TSQL Supongo

SELECT myDate
FROM myTable
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE()
 1
Author: mvirant,
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
2018-03-08 13:49:50