2010-07-19 20 views
10

Estoy usando la siguiente consulta para apuntar resultados que son exactamente X días más antiguos que la hora actual.seleccionando registros en mysql db desde 1, 7 y 30 días con datetime y php

SELECT *, 
     DATE_FORMAT(datetime, '%m/%d/%Y') 
    FROM table 
    WHERE datetime BETWEEN SYSDATE() - INTERVAL 30 DAY 
        AND SYSDATE() 
ORDER BY ID DESC 

El problema es que los datos que regresan desde el primer día actual si un registro desde hace exactamente 30 días no lo existe, así como los datos irrelevantes

hay una mejor manera de hacer esto?

Respuesta

21

BETWEEN incluye todos los valores intermedios los dos argumentos, incluido el valor en cada extremo. En otras palabras, BETWEEN 1 AND 4 incluye los valores 1, 2, 3 y 4. No solo 1 y 4, y no solo 2 y 3.

Si solo quiere fechas del único día que hace 30 días, intente esto :

SELECT *, 
     DATE_FORMAT(datetime, '%m/%d/%Y') 
    FROM table 
    WHERE DATE(datetime) = CURDATE() - INTERVAL 30 DAY 
ORDER BY ID DESC 

uso CURDATE() en lugar de SYSDATE() PORQUE CURDATE() devuelve una fecha sin un componente de tiempo.

+2

El uso de CURDATE es discutible si está ejecutando la columna de fecha y hora a través de un código sin función, pero no puede usar un índice si existe uno en la columna 'datetime'. –

10

Su consulta está configurada para obtener registros entre el día de hoy (incluido el tiempo) y los 30 días anteriores.

Si desea que los registros que tienen más de 30 días (a la vez), el uso:

SELECT *, 
     DATE_FORMAT(datetime, '%m/%d/%Y') 
    FROM table 
    WHERE datetime <= DATE_SUB(SYSDATE(), INTERVAL 30 DAY) 
ORDER BY ID DESC 

Si quieres aquellos que son sólo 30 días de edad, no 31 o 29, sin respeto por el momento porción - uso:

SELECT *, 
     DATE_FORMAT(datetime, '%m/%d/%Y') 
    FROM table 
    WHERE DATE_FORMAT(datetime, '%m/%d/%Y') = DATE_FORMAT(DATE_SUB(SYSDATE(), INTERVAL 30 DAY), '%m/%d/%Y') 
ORDER BY ID DESC 
+0

La primera consulta obtiene todo> = 30 días. Desearía usar> = para obtener todo entre hoy, sysdate() y 30 días. y desearía usar = para obtener la información del día exactamente hace 30 días. – ChuckCottrill

Cuestiones relacionadas