Pokud vybíráte pouze podle data, založte své výpočty na CURDATE
(které vrací pouze datum) spíše než NOW
(který vrátí datum a čas). Tyto příklady zachytí všechny časy v rámci denních rozsahů:
- Dnes:
WHERE timestamp >= CURDATE()
- Včera:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
- Tento měsíc:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
- Mezi dvěma daty 3. června 2013 a 7. června 2013 (všimněte si, že datum ukončení je uvedeno na 8. června, nikoli 7. června):
WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'
„Tento týden“ závisí na tom, kterým dnem týden začínáte; To nechám na vás. Můžete použít DAYOFWEEK
funkce k vyladění CURDATE()
do správných rozsahů.
Dodatek :Typ sloupce OP byl INTEGER
, ukládající časové razítko UNIX a moje odpověď předpokládala, že typ sloupce byl TIMESTAMP
. Zde je návod, jak dělat všechny stejné věci s hodnotou časového razítka UNIX a stále udržovat optimalizaci, pokud je sloupec indexován (jako odpovědi výše, pokud je TIMESTAMP
sloupec je indexován)...
V zásadě je řešením jen zabalit počáteční a/nebo koncová data do UNIX_TIMESTAMP
funkce:
- Dnes:
WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
- Včera:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
- Tento měsíc:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
- Mezi dvěma daty 3. června 2013 a 7. června 2013 (všimněte si, že datum ukončení je uvedeno na 8. června, nikoli 7. června):
WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')