MySQL SELECT * WHERE timestamp = СЕГОДНЯ

Я пытаюсь выбрать только сегодняшние записи из таблицы базы данных.

В настоящее время я использую

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(),'%');