Как выбрать дату из столбца 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%'
в этом случае должно работать