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