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')