Как выбрать дату из столбца типа 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.


вы можете отформатировать datetime в часть Y-M-D:

DATE_FORMAT(datetime, '%Y-%m-%d')

хотя все ответы на странице вернут желаемый результат, все они имеют проблемы с производительностью. не выполнять вычисления на полях в 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%", он должен работать в этом случае