Si está seleccionando solo por fecha, base sus cálculos en CURDATE
(que devuelve solo la fecha) en lugar de NOW
(que devuelve fecha y hora). Estos ejemplos capturarán todas las horas dentro de los rangos de días:
- Hoy:
WHERE timestamp >= CURDATE()
- Ayer:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
- Este mes:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
- Entre las dos fechas 3 de junio de 2013 y 7 de junio de 2013 (observe que la fecha de finalización se especifica como 8 de junio, no como 7 de junio):
WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'
El "esta semana" depende de qué día comienzas tu semana; Te lo dejo a ti. Puede usar el DAYOFWEEK
función para modificar CURDATE()
a los rangos adecuados.
Anexo :el tipo de columna de OP era INTEGER
, almacenando una marca de tiempo UNIX, y mi respuesta asumió que el tipo de columna era TIMESTAMP
. Aquí se explica cómo hacer las mismas cosas con un valor de marca de tiempo UNIX y aún así mantener la optimización si la columna está indexada (como lo harán las respuestas anteriores si TIMESTAMP
la columna está indexada)...
Básicamente, la solución es envolver las fechas de inicio y/o finalización en el UNIX_TIMESTAMP
función:
- Hoy:
WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
- Ayer:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
- Este mes:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
- Entre las dos fechas 3 de junio de 2013 y 7 de junio de 2013 (observe que la fecha de finalización se especifica como 8 de junio, no como 7 de junio):
WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')