Как выбрать дату из столбца datetime? - PullRequest
203 голосов
/ 18 ноября 2009

У меня есть столбец типа «datetime» со значениями, такими как 2009-10-20 10: 00: 00

Я бы хотел извлечь дату из даты и времени и написать запрос вроде:

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 ]

379 голосов
/ 18 ноября 2009

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

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

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

WHERE datetime LIKE '2009-10-20%'

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

81 голосов
/ 21 мая 2015

Использование 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'

Обновление: влияние на использование 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.

23 голосов
/ 02 января 2014

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

DATE_FORMAT(datetime, '%Y-%m-%d')
10 голосов
/ 16 апреля 2017

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

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

Правильный способ запросить поле MySQL timestamp для определенного дня - это проверить значения «Больше-равно-равно» для требуемой даты и «Меньше, чем» на следующий день, без указания часа.

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

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

7 голосов
/ 02 июня 2018

Вот все форматы

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

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

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))
3 голосов
/ 10 марта 2015

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

пример

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

ИЛИ

SELECT * FROM 
data 
WHERE date(datetime ) >=   '2009-10-20'  && date(datetime )  <= '2009-10-20'
0 голосов
/ 22 июля 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...