Se selezioni solo per data, basa i tuoi calcoli su CURDATE
(che restituisce solo la data) anziché NOW
(che restituisce data e ora). Questi esempi cattureranno tutti gli orari negli intervalli di giorni:
- Oggi:
WHERE timestamp >= CURDATE()
- Ieri:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
- Questo mese:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
- Tra le due date 3 giugno 2013 e 7 giugno 2013 (notare come la data di fine è specificata come 8 giugno, non 7 giugno):
WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'
La "questa settimana" dipende dal giorno in cui inizi la settimana; Lo lascio a te. Puoi utilizzare DAYOFWEEK
funzione per modificare CURDATE()
agli intervalli appropriati.
Appendice :il tipo di colonna dell'OP era INTEGER
, memorizzando un timestamp UNIX e la mia risposta presumeva che il tipo di colonna fosse TIMESTAMP
. Ecco come fare tutte le stesse cose con un valore di timestamp UNIX e mantenere comunque l'ottimizzazione se la colonna è indicizzata (come faranno le risposte sopra se il TIMESTAMP
colonna è indicizzata)...
Fondamentalmente, la soluzione è semplicemente racchiudere le date di inizio e/o fine in UNIX_TIMESTAMP
funzione:
- Oggi:
WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
- Ieri:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
- Questo mese:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
- Tra le due date 3 giugno 2013 e 7 giugno 2013 (notare come la data di fine è specificata come 8 giugno, non 7 giugno):
WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')