Ако избирате само по дата, базирайте изчисленията си на CURDATE
(който връща само дата), а не NOW
(който връща дата и час). Тези примери ще уловят всички времена в рамките на дневните диапазони:
- Днес:
WHERE timestamp >= CURDATE()
- Вчера:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
- Този месец:
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
- Между двете дати 3 юни 2013 г. и 7 юни 2013 г. (обърнете внимание как крайната дата е посочена като 8 юни, а не 7 юни):
WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'
"Тази седмица" зависи от кой ден започвате седмицата си; ще оставя това на вас. Можете да използвате DAYOFWEEK
функция за настройване на CURDATE()
до правилните диапазони.
Допълнение :Типът колона на OP беше INTEGER
, съхраняващ UNIX времеви печат и моят отговор предполагаше, че типът на колоната е TIMESTAMP
. Ето как да направите едни и същи неща със стойност на времеви отпечатък в UNIX и все пак да поддържате оптимизация, ако колоната е индексирана (както ще направят отговорите по-горе, ако TIMESTAMP
колоната е индексирана)...
По принцип решението е просто да обвиете началната и/или крайната дата в UNIX_TIMESTAMP
функция:
- Днес:
WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
- Вчера:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
- Този месец:
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
- Между двете дати 3 юни 2013 г. и 7 юни 2013 г. (обърнете внимание как крайната дата е посочена като 8 юни, а не 7 юни):
WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')