Ако избирате само по дата, базирайте изчисленията си на 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')