MySQL Query - Registros entre hoy y los últimos 30 días

122

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.

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.

¿Alguien puede señalarme en la dirección correcta? Se siente como si estuviera cerca.

Gracias y que tenga una gran semana.

Jason Sweet
fuente

Respuestas:

292

Debe aplicar DATE_FORMATen la SELECTcláusula, no en la WHEREclá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()solo devuelve la DATEparte de la fecha, por lo que si almacena create_datecomo DATETIMEcon la parte de tiempo llena, esta consulta no seleccionará los registros de hoy.

En este caso, deberá usar NOWen su lugar:

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
Quassnoi
fuente
¡La segunda parte de esta respuesta es muy importante! Puede que haya tenido o no ese problema y me estaba rascando la cabeza hasta que volví a esta respuesta.
Tyler Lazenby
@Quassnoi lo siento. Esto parece ser solo un problema de preparación de WordPress \ wpdb. Lo siento de nuevo.
vee
56
SELECT
    *
FROM
    < table_name >
WHERE
    < date_field > BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY)
AND NOW();
Thinkcast
fuente
2
Prefiero este método ENTRE CURDATE () - INTERVALO 30
Dan
1
@ErmSo puedo saber por qué?
delgado
3
No mentiré, ¡eso fue hace 2 años y no puedo recordarlo! Lo sentimos: P
Dan
1
No es necesario usarDATE_FORMAT(create_date, '%m/%d/%Y')
kazy
@Dan, prefiero hacerlo más legible incluyendo la fecha anterior entre paréntesis: ... WHERE create_date BETWEEN (NOW() - INTERVAL 30 DAY) AND NOW()
Kris Craig
10

DATE_FORMATdevuelve una cadena, por lo que está usando dos cadenas en su BETWEENcláusula, que no funcionará como espera.

En su lugar, convierta la fecha a su formato en SELECTy haga las BETWEENfechas 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()
Rich Adams
fuente
9

También puedes escribir esto en mysql -

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date < DATE_ADD(NOW(), INTERVAL -1 MONTH);

FIJO

Rohit Suthar
fuente
2
Cuidado: a pesar de los votos positivos, esto selecciona fechas en los próximos 30 días / mes, ¡no en los últimos 30 días!
JonBrave
44
De acuerdo, debe estar DONDE create_date> DATE_ADD (NOW (), INTERVAL -1 MONTH);
Bhavik P.
6

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

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

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

SELECT myDate
FROM myTable
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE()
mvirant
fuente