Ответ 1
Если вы выбираете только по дате, основывайте свои вычисления на 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()
на соответствующие диапазоны.
Addendum: тип столбца 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')