Я пытаюсь выбрать только сегодняшние записи из таблицы базы данных.
В настоящее время я использую
SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));
Но это приводит к результатам за последние 24 часа, и мне нужно только отобрать результаты с сегодняшнего дня, игнорируя время. Как я могу выбрать результаты только на основе даты?
используйте DATE
и CURDATE()
SELECT * FROM `table` WHERE DATE(`timestamp`) = CURDATE()
Думаю, использование DATE
прежнему использует INDEX .
см. план выполнения на DEMO
Если вы хотите, чтобы индекс использовался и запрос не выполнял сканирование таблицы:
WHERE timestamp >= CURDATE() AND timestamp < CURDATE() + INTERVAL 1 DAY
Чтобы показать разницу, которую это делает в реальных планах выполнения, мы проверим SQL-Fiddle (чрезвычайно полезный сайт):
CREATE TABLE test --- simple table ( id INT NOT NULL AUTO_INCREMENT ,`timestamp` datetime --- index timestamp , data VARCHAR(100) NOT NULL DEFAULT 'Sample data' , PRIMARY KEY (id) , INDEX t_IX (`timestamp`, id) ) ; INSERT INTO test (`timestamp`) VALUES ('2013-02-08 00:01:12'), --- --- insert about 7k rows ('2013-02-08 20:01:12') ;
Давайте попробуем 2 версии сейчас.
Версия 1 с DATE(timestamp) = ?
EXPLAIN SELECT * FROM test WHERE DATE(timestamp) = CURDATE() --- using DATE(timestamp) ORDER BY timestamp ;
Объясните:
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF 1 SIMPLE test ALL ROWS FILTERED EXTRA 6671 100 Using where; Using filesort
Он фильтрует все строки (6671), а затем делает fileort (это не проблема, поскольку возвращенных строк немного)
Версия 2 с timestamp <= ? AND timestamp < ?
timestamp <= ? AND timestamp < ?
EXPLAIN SELECT * FROM test WHERE timestamp >= CURDATE() AND timestamp < CURDATE() + INTERVAL 1 DAY ORDER BY timestamp ;
Объясните:
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF 1 SIMPLE test range t_IX t_IX 9 ROWS FILTERED EXTRA 2 100 Using where
Он использует сканирование диапазона по индексу , а затем считывает только соответствующие строки из таблицы.
SELECT * FROM `table` WHERE timestamp >= CURDATE()
он короче, нет необходимости использовать «И временную метку» <CURDATE () + INTERVAL 1 DAY '
потому что CURDATE () всегда возвращает текущий день
Функция MySQL CURDATE ()
Просто добавьте его к дате:
SELECT * FROM `table` WHERE CAST(`timestamp` TO DATE) == CAST(NOW() TO DATE)
Сколько способов мы можем убрать эту кошку? Вот еще один вариант.
SELECT * FROM table
WHERE DATE (FROM_UNIXTIME ( timestamp
)) = '2015-11-18';
Это может быть самым простым на мой взгляд:
SELECT * FROM `table` WHERE `timestamp` like concat(CURDATE(),'%');