У меня есть столбец типа «datetime» со значениями, как 2009-10-20 10:00:00
Я хотел бы извлечь дату из datetime и написать запрос как:
SELECT * FROM
data
WHERE datetime = '2009-10-20'
ORDER BY datetime DESC
Это следующий лучший способ сделать это?
SELECT * FROM
data
WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59')
ORDER BY datetime DESC
Это однако возвращает пустой набор результатов. Какие-либо предложения?
Использование
WHERE DATE(datetime) = '2009-10-20'
имеет проблемы с производительностью . Как указано здесь :DATE()
для всех строк, включая те, которые не совпадают.Используйте
BETWEEN
или>
,<
,=
операторы , которые позволяют использовать индекс:Обновление: воздействие на использование
LIKE
вместо операторов в индексированном столбце является высоким . Вот некоторые результаты теста для таблицы с 1 176 000 строками:datetime LIKE '2009-10-20%'
=> 2931мсdatetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59'
=> 168 мсПри повторном вызове по тому же запросу разница еще выше: 2984мс против 7мс (да, всего 7 миллисекунд!). Я нашел это, переписывая старый код в проекте, используя Hibernate.
источник
DATE(datetime)
вBETWEEN AND
новые сцены, мы получаем короткое заявление и отличную производительность. Почему нет? Почему они этого не сделали? :)DATE(datetime) in (:list)
не работает сBETWEEN
Вы можете отформатировать дату и время в часть YMD:
источник
DATE_FORMAT(datetime, '%H:%i:%S')
Хотя все ответы на странице вернут желаемый результат, все они имеют проблемы с производительностью. Никогда не выполняйте вычисления над полями в
WHERE
предложении (включаяDATE()
вычисление), поскольку это вычисление должно выполняться для всех строк в таблице.BETWEEN ... AND
Конструкт включительно для обоего граничных условий, требующий один , чтобы указать 23:59:59 синтаксиса на дате окончания , который сам имеет другие проблемы (микросекунды сделку, которые я считаю , MySQL не поддерживает в 2009 году , когда был задан вопрос).Правильный способ запросить
timestamp
поле MySQL для определенного дня - это проверить значения Greater-Than-Equals на требуемую дату и Less-Than на следующий день без указания часа.Это самый быстрый и эффективный метод с наименьшим объемом памяти и наименьшими ресурсами, который дополнительно поддерживает все функции MySQL и такие примеры, как точность отметки времени менее секунды. Кроме того, это доказательство будущего.
источник
Здесь все форматы
Скажем, это столбец, который содержит
datetime
значение, таблицаdata
.источник
Ты можешь использовать:
Или:
Или:
источник
простой и лучший способ использовать функцию даты
пример
ИЛИ
источник
Что ж, использование
LIKE
в выражении является лучшим вариантом,WHERE datetime LIKE '2009-10-20%'
оно должно работать в этом случаеисточник