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


однако это возвращает пустой результирующий набор. Есть предложения?

525   8  

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.

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

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

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

    Ничего не найдено.