Как выбрать дату из столбца типа 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
это, однако, возвращает пустой resultset. Есть предложения?
8 ответов
WHERE DATE(datetime) = '2009-10-20'
или попробуйте это также и посмотрите, работает ли он на not. Помогает ли это
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()
расчет), что расчет должен выполняться для всех строк в таблице.
на BETWEEN ... AND
construct является включительным для обоих граничных условий, требуя указать синтаксис 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'
Ну, использование like in statement является лучшим вариантом, где datetime, как " 2009-10-20%", он должен работать в этом случае