Om du endast väljer efter datum, basera dina beräkningar på CURDATE (som endast returnerar datum) snarare än NOW (som returnerar datum och tid). Dessa exempel kommer att fånga alla tider inom dagsintervallen:
- Idag:
WHERE timestamp >= CURDATE() - Igår:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE() - Denna månad:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY) - Mellan de två datumen 3 juni 2013 och 7 juni 2013 (notera hur slutdatumet anges som 8 juni, inte 7 juni):
WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'
"denna vecka" beror på vilken dag du börjar din vecka; Jag lämnar det till dig. Du kan använda DAYOFWEEK
funktion för att justera CURDATE() till rätt intervall.
Tillägg :OP:s kolumntyp var INTEGER , lagrar en UNIX-tidsstämpel, och mitt svar antog att kolumntypen var TIMESTAMP . Så här gör du samma saker med ett UNIX-tidsstämpelvärde och fortfarande bibehåller optimering om kolumnen är indexerad (som svaren ovan kommer att göra om TIMESTAMP kolumnen är indexerad)...
I grund och botten är lösningen att bara slå in start- och/eller slutdatum i UNIX_TIMESTAMP
funktion:
- Idag:
WHERE timestamp >= UNIX_TIMESTAMP(CURDATE()) - Igår:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE()) - Denna månad:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)) - Mellan de två datumen 3 juni 2013 och 7 juni 2013 (notera hur slutdatumet anges som 8 juni, inte 7 juni):
WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')