Ответ 1
используйте DATE
и CURDATE()
SELECT * FROM `table` WHERE DATE(`timestamp`) = CURDATE()
Я предполагаю, что использование DATE
все еще использует INDEX.
Я пытаюсь выбрать только сегодняшние записи из таблицы базы данных.
В настоящее время я использую
SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));
Но это приводит к результатам за последние 24 часа, и мне нужно только отобрать результаты с сегодняшнего дня, игнорируя время. Как я могу выбрать результаты только на основе даты?
используйте DATE
и CURDATE()
SELECT * FROM `table` WHERE DATE(`timestamp`) = CURDATE()
Я предполагаю, что использование DATE
все еще использует INDEX.
Если вы хотите, чтобы индекс использовался и запрос не выполнял сканирование таблицы:
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 < ?
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()
короче, нет необходимости использовать 'AND timestamp <CURDATE() + INTERVAL 1 DAY'
потому что CURDATE() всегда возвращает текущий день
Просто добавьте его к дате:
SELECT * FROM `table` WHERE CAST(`timestamp` TO DATE) == CAST(NOW() TO DATE)
Сколько способов мы можем скрыть эту кошку? Вот еще один вариант.
SELECT * FROM table
ГДЕ ДАТА (FROM_UNIXTIME (timestamp
)) = '2015-11-18';
Если вы хотите сравнить с определенной датой, вы можете написать ее так:
выберите * из table_name
где timestamp> = '2018-07-07';
//здесь отметка времени - это имя столбца, имеющего тип как отметка времени
или же
Для получения сегодняшней даты доступна функция CURDATE(), поэтому:
выберите * из table_name
где timestamp> = CURDATE();
На Visual Studio 2017, используя встроенную базу данных для разработки, у меня были проблемы с текущим данным решением, мне пришлось изменить код, чтобы он работал, потому что он выдавал ошибку, что DATE() не была встроенной функцией.
Вот мое решение:
where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)
Это может быть самым простым на мой взгляд:
SELECT * FROM `table` WHERE `timestamp` like concat(CURDATE(),'%');