Как выбрать дату из столбца типа datetime?
у меня есть столбец типа "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
однако это возвращает пустой результирующий набор. Есть предложения?
8 ответов:
WHERE DATE(datetime) = '2009-10-20'или попробуйте это также и посмотреть, работает ли он на не. Помогает ли это
WHERE datetime LIKE '2009-10-20%'вам нужно проверить, работает ли он на не.
используя
WHERE DATE(datetime) = '2009-10-20'есть проблемы с производительностью. Как сказано здесь:
- он будет рассчитывать
DATE()для всех строк, включая те, которые не соответствуют- это сделает невозможным использование индекса для запроса
использовать
BETWEENили>,<,=операторы, которые позволяют использовать индекс:SELECT * FROM data WHERE datetime BETWEEN '2009-10-20 00:00:00' AND '2009-10-20 23:59:59'
обновление: the влияние об использовании
LIKEвместо операторов в индексированном столбце высокая. Вот некоторые результаты тестирования в таблице с 1 176 000 строк:
- используя
datetime LIKE '2009-10-20%'=> 2931ms- используя
datetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59'=> 168msпри выполнении второго вызова по тому же запросу разница еще выше: 2984ms против 7ms (да, всего 7 миллисекунд!). Я нашел это, переписывая какой-то старый код в проекте с помощью Hibernate.
хотя все ответы на странице вернут желаемый результат, все они имеют проблемы с производительностью. никогда не выполняйте вычисления на полях в
WHEREпункт (в том числеDATE()расчет), что расчет должен выполняться для всех строк в таблице.The
BETWEEN ... ANDконструкция включена для обоих граничных условий, требуя указать синтаксис 23: 59:59 на дату окончания, которая сама по себе имеет другие проблемы (микросекундные транзакции, которые я считаю, что MySQL не поддерживал в 2009 году, когда был задан вопрос).правильный способ запроса MySQL
timestampполе для конкретного дня-это проверка на большее-чем-равно против желаемой даты, и меньше-чем на следующий день, без указания часа.WHERE datetime>='2009-10-20' AND datetime<'2009-10-21'Это самый быстродействующий, самый низкий объем памяти, наименее ресурсоемкий метод и дополнительно поддерживает все функции MySQL и угловые случаи, такие как точность субсекундной метки времени. Кроме того, это на будущее.
вы можете использовать:
DATEDIFF ( day , startdate , enddate ) = 0или:
DATEPART( day, startdate ) = DATEPART(day, enddate) AND DATEPART( month, startdate ) = DATEPART(month, enddate) AND DATEPART( year, startdate ) = DATEPART(year, enddate)или:
CONVERT(DATETIME,CONVERT(VARCHAR(12), startdate, 105)) = CONVERT(DATETIME,CONVERT(VARCHAR(12), enddate, 105))
вот все форматы
скажем, это столбец, который содержит
datetimeзначением, таблицаdata.+--------------------+ | date_created | +--------------------+ | 2018-06-02 15:50:30| +--------------------+
mysql> select DATE(date_created) from data; +--------------------+ | DATE(date_created) | +--------------------+ | 2018-06-02 | +--------------------+
mysql> select YEAR(date_created) from data; +--------------------+ | YEAR(date_created) | +--------------------+ | 2018 | +--------------------+
mysql> select MONTH(date_created) from data; +---------------------+ | MONTH(date_created) | +---------------------+ | 6 | +---------------------+
mysql> select DAY(date_created) from data; +-------------------+ | DAY(date_created) | +-------------------+ | 2 | +-------------------+
mysql> select HOUR(date_created) from data; +--------------------+ | HOUR(date_created) | +--------------------+ | 15 | +--------------------+
mysql> select MINUTE(date_created) from data; +----------------------+ | MINUTE(date_created) | +----------------------+ | 50 | +----------------------+
mysql> select SECOND(date_created) from data; +----------------------+ | SECOND(date_created) | +----------------------+ | 31 | +----------------------+
простой и лучший способ использовать функции даты
пример
SELECT * FROM data WHERE date(datetime) = '2009-10-20'или
SELECT * FROM data WHERE date(datetime ) >= '2009-10-20' && date(datetime ) <= '2009-10-20'
Ну, используя как в заявлении является лучшим вариантом, где datetime, как " 2009-10-20%", он должен работать в этом случае
Comments