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

Это возвращает пустой набор результатов. Любые предложения?

Ответ 1

Вы можете использовать функцию MySQL DATE():

WHERE DATE(datetime) = '2009-10-20'

Вы также можете попробовать это:

WHERE datetime LIKE '2009-10-20%'

См. Этот ответ для получения информации о влиянии на производительность использования LIKE.

Ответ 2

Использование WHERE DATE(datetime) = '2009-10-20' имеет проблемы с производительностью. Как указано here:

  • он рассчитает DATE() для всех строк, включая те, которые не соответствуют
  • это сделает невозможным использование индекса для запроса

Используйте операторы BETWEEN или >, <, =, которые позволяют использовать индекс:

SELECT * FROM data 
WHERE datetime BETWEEN '2009-10-20 00:00:00' AND '2009-10-20 23:59:59'

Обновить при использовании 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

При выполнении второго вызова по одному и тому же запросу разница еще выше: 2984 мс против 7 мс (да, всего 7 миллисекунд!). Я нашел это, переписывая старый код в проекте с использованием Hibernate.

Ответ 3

Вы можете отформатировать дату и время до части Y-M-D:

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

Ответ 4

Хотя все ответы на странице вернут желаемый результат, все они имеют проблемы с производительностью. Никогда не выполняйте вычисления полей в предложении WHERE (включая вычисление DATE()), поскольку этот расчет должен выполняться для всех строк в таблице.

Конструкция BETWEEN ... AND включена для обоих граничных условий, требуя указать синтаксис 23:59:59 на дату окончания, которая сама имеет другие проблемы (микросекундные транзакции, которые, как я полагаю, MySQL не поддерживал в 2009 году, когда вопрос был задан).

Правильный способ запроса в поле MySQL timestamp для определенного дня - это проверить для Greater-Than-Equals против нужной даты и Less-Than на следующий день, без указания часа.

WHERE datetime>='2009-10-20' AND datetime<'2009-10-21'

Это самый быстрый, минимально-ресурсный метод с наименьшим объемом памяти, а также поддерживает все функции и угловые случаи MySQL, такие как временная метка временной метки. Кроме того, это будущее доказательство.

Ответ 5

Здесь все форматы

Скажем, это столбец, который содержит значение 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 |
+----------------------+

Ответ 6

Вы можете использовать:

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))

Ответ 7

простой и лучший способ использования функции даты

Пример

SELECT * FROM 
data 
WHERE date(datetime) = '2009-10-20' 

ИЛИ

SELECT * FROM 
data 
WHERE date(datetime ) >=   '2009-10-20'  && date(datetime )  <= '2009-10-20'

Ответ 8

Что ж, использование LIKE в утверждении - лучший вариант, WHERE datetime LIKE '2009-10-20%' в этом случае должно работать