Я пытаюсь выбрать только сегодняшние записи из таблицы базы данных.
В настоящее время я использую
SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));
Но для этого нужны результаты за последние 24 часа, и мне нужно только выбрать результаты за сегодняшний день, игнорируя время. Как выбрать результаты только по дате?
Using where; Using index
?timestamp
(иdate
как в моем случае) это зарезервированное слово MySQLЕсли вы хотите, чтобы использовался индекс, а запрос не сканировал таблицу:
Чтобы показать, как это влияет на фактические планы выполнения, мы протестируем SQL-Fiddle (чрезвычайно полезный сайт):
Давайте попробуем сейчас две версии.
Версия 1 с
DATE(timestamp) = ?
Объясните:
Он фильтрует все (6671) строки, а затем выполняет сортировку файлов (это не проблема, поскольку возвращаемых строк мало)
Версия 2 с
timestamp <= ? AND timestamp < ?
Объясните:
Он использует сканирование диапазона по индексу , а затем читает только соответствующие строки из таблицы.
источник
INDEX t_IX (timestamp, id)
могло (должно?) просто бытьINDEX t_IX (timestamp)
, поскольку первичный ключ подразумевается в индексе. или есть причина, по которой я этого не понимаю? Я попробовал это в sql-fiddle и увидел тот же (лучший) план выполненияid
(потому что это PK и, следовательно, кластерный индекс таблицы) добавляется в индекс в любом случае. Так что явно добавить его не помешает (и это может уловить некоторые слепые зоны оптимизатора). Это конечно не актуально в данном случае / запросе.timestamp < CURDATE() + INTERVAL 1 DAY
это нужно?он короче, нет необходимости использовать 'AND timestamp <CURDATE () + INTERVAL 1 DAY'
потому что CURDATE () всегда возвращает текущий день
Функция MySQL CURDATE ()
источник
Сколько способов снять шкуру с этой кошки? Вот еще один вариант.
ВЫБРАТЬ * ОТ
table
ГДЕ ДАТА (FROM_UNIXTIME (timestamp
)) = '2015-11-18';источник
Если вы хотите сравнить с определенной датой, вы можете написать ее так:
// здесь временная метка - это имя столбца, имеющего тип как временная метка
или
Для получения сегодняшней даты доступна функция CURDATE (), поэтому:
источник
Просто приведите его к дате:
источник
На мой взгляд, это может быть проще всего:
источник
Или вы можете использовать альтернативу CURRENT_DATE с тем же результатом:
Примеры из database.guide
источник
В Visual Studio 2017, используя встроенную базу данных для разработки, у меня возникли проблемы с текущим заданным решением, мне пришлось изменить код, чтобы заставить его работать, потому что он выдал ошибку, что DATE () не была встроенной функцией.
Вот мое решение:
where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)
источник