Hvis du kun vælger efter dato, skal du basere dine beregninger på CURDATE
(som kun returnerer dato) i stedet for NOW
(som returnerer dato og klokkeslæt). Disse eksempler vil fange alle tidspunkter inden for dagintervallerne:
- I dag:
WHERE timestamp >= CURDATE()
- I går:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
- Denne måned:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
- Mellem de to datoer 3. juni 2013 og 7. juni 2013 (bemærk, hvordan slutdatoen er angivet som 8. juni, ikke 7. juni):
WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'
"denne uge" afhænger af, hvilken dag du starter din uge; Det overlader jeg til dig. Du kan bruge DAYOFWEEK
funktion til at justere CURDATE()
til de rigtige områder.
Tillæg :OP's kolonnetype var INTEGER
, gemmer et UNIX-tidsstempel, og mit svar antog, at kolonnetypen var TIMESTAMP
. Her er, hvordan du gør alle de samme ting med en UNIX-tidsstempelværdi og stadig opretholder optimering, hvis kolonnen er indekseret (som svarene ovenfor vil gøre, hvis TIMESTAMP
kolonne er indekseret)...
Grundlæggende er løsningen bare at indpakke start- og/eller slutdatoerne i UNIX_TIMESTAMP
funktion:
- I dag:
WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
- I går:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
- Denne måned:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
- Mellem de to datoer 3. juni 2013 og 7. juni 2013 (bemærk, hvordan slutdatoen er angivet som 8. juni, ikke 7. juni):
WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')