2010-01-11 247 views
85

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 por motivos de visualización.MySQL Query - Registros entre hoy y los últimos 30 días

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

Mi declaración no para limitar los registros de los últimos 30 días - se selecciona todos los registros.

¿Alguien puede indicarme la dirección correcta? Se siente como si estuviera cerca.

Gracias y que tengas una gran semana.

Respuesta

201

es necesario aplicar DATE_FORMAT en la cláusula SELECT, no el WHERE cláusula:

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() devoluciones solamente la porción DATE de la fecha, por lo que si almacena create_date como DATETIME con el tiempo porción completa, esta consulta no seleccionará los registros de hoy.

En este caso, tendrá que utilizar NOW lugar:

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

gracias, funcionó para mí. – Brij

+1

Gracias por explicarme también cómo funciona si uno tiene una columna DATETIME. ¡Increíble! – Adam

+0

después de que muchas búsquedas finalmente te encontraron. ;) +1 y buena explicación –

8

DATE_FORMAT devuelve una cadena, por lo que está usando dos cuerdas en su BETWEEN cláusula, que no va a funcionar como se esperar.

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() 
46
SELECT 
    * 
FROM 
    <table_name> 
WHERE 
    <date_field> BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) 
AND NOW(); 
+2

Prefiero este método ENTRE CURDATE() - INTERVALO 30 – Dan

+0

@ErmSo ¿puedo saber por qué? – slim

+1

No voy a mentir, eso fue hace 2 años y no recuerdo. Lo sentimos: P – Dan

4

para la actividad fecha actual y la actividad completa durante 30 días previos usar esto, ya que el SYSDATE es variable en un día, el día 30 anterior no tendrá toda la información 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

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); 
3

me gustaría hacer algo como esto:

SELECT DATE_FORMAT(create_date, '%m/%d/%Y') 
FROM mytable 
WHERE create_date >= (CURDATE() - INTERVAL 30 DAY) 
+0

Esto mostrará los registros de datos más allá de CURDATE(). – xam

-1

Aquí es una solución sin utilizar curdate() función, esta es una solución para aquellos quien usa TSQL supongo

SELECT myDate 
FROM myTable 
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE() 
Cuestiones relacionadas