Als je alleen op datum selecteert, baseer je je berekeningen dan op CURDATE
(die alleen de datum retourneert) in plaats van NOW
(die datum en tijd retourneert). Deze voorbeelden zullen alle tijden binnen de dagbereiken opvangen:
- Vandaag:
WHERE timestamp >= CURDATE()
- Gisteren:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
- Deze maand:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
- Tussen de twee datums 3 juni 2013 en 7 juni 2013 (let op hoe de einddatum is gespecificeerd als 8 juni, niet 7 juni):
WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'
De "deze week" hangt af van op welke dag je je week begint; Dat laat ik aan jou over. U kunt de DAYOFWEEK
functie om CURDATE()
aan te passen naar het juiste bereik.
Aanvulling :OP's kolomtype was INTEGER
, het opslaan van een UNIX-tijdstempel, en mijn antwoord ging ervan uit dat het kolomtype TIMESTAMP
was . Hier leest u hoe u allemaal dezelfde dingen kunt doen met een UNIX-tijdstempelwaarde en toch de optimalisatie handhaaft als de kolom is geïndexeerd (zoals de bovenstaande antwoorden zullen doen als de TIMESTAMP
kolom is geïndexeerd)...
Kortom, de oplossing is om de begin- en/of einddatums gewoon in de UNIX_TIMESTAMP
functie:
- Vandaag:
WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
- Gisteren:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
- Deze maand:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
- Tussen de twee datums 3 juni 2013 en 7 juni 2013 (let op hoe de einddatum wordt gespecificeerd als 8 juni, niet 7 juni):
WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')