MySQL сравнивает строку DATE со строкой из поля DATETIME - PullRequest
78 голосов
/ 03 мая 2010

У меня есть вопрос: можно ли выбрать из базы данных MySQL, сравнив одну строку DATE "2010-04-29" со строками, которые хранятся как DATETIME (2010-04-29 10:00)?

У меня есть один инструмент выбора даты, который фильтрует данные, и я хотел бы запросить таблицу по полю DATETIME, например так:

SELECT * FROM `calendar` WHERE startTime = '2010-04-29'"

... и я хотел бы получить строку со значением DATETIME "2010-04-29 10:00".

Есть предложения? Спасибо.

Ответы [ 6 ]

134 голосов
/ 03 июля 2013

Используйте следующее:

SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'

Просто для справки. У меня 2 миллиона записей, я выполнил аналогичный запрос. Ответ Salils занял 4,48 секунды, выше - 2,25 секунды.

Так что, если таблица БОЛЬШАЯ, я бы скорее предложил это.

30 голосов
/ 18 июня 2013

Если вы хотите выбрать все строки, в которых часть DATE столбца DATETIME соответствует определенному литералу, вы не можете сделать это следующим образом:

WHERE startTime = '2010-04-29'

потому что MySQL не может сравнивать DATE и DATETIME напрямую. Что MySQL делает, он расширяет данный литерал DATE со временем «00: 00: 00». Таким образом, ваше состояние становится

WHERE startTime = '2010-04-29 00:00:00'

Конечно, не то, что вы хотите!

Условие является диапазоном, и, следовательно, оно должно быть задано как диапазон. Есть несколько возможностей:

WHERE startTime BETWEEN '2010-04-29 00:00:00' AND '2010-04-29 23:59:59'
WHERE startTime >= '2010-04-29' AND startTime < ('2010-04-29' + INTERVAL 1 DAY)

Существует небольшая вероятность того, что первый ошибется - когда ваш столбец DATETIME использует разрешение ниже второго, и в 23:59:59 + epsilon назначена встреча. В общем, предлагаю использовать второй вариант.

Оба варианта могут использовать индекс startTime, который станет важным при увеличении таблицы.

20 голосов
/ 03 мая 2010
SELECT * FROM `calendar` WHERE DATE_FORMAT(startTime, "%Y-%m-%d") = '2010-04-29'"

ИЛИ

SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'
1 голос
/ 24 ноября 2014
SELECT * FROM sample_table WHERE last_visit = DATE_FORMAT('2014-11-24 10:48:09','%Y-%m-%d %H:%i:%s')

это для формата даты и времени в mysql с использованием DATE_FORMAT(date,format).

1 голос
/ 20 сентября 2014
SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29';

это помогает, вы можете преобразовать значения как DATE перед сравнением.

0 голосов
/ 03 мая 2010
SELECT * FROM `calendar` WHERE startTime like '2010-04-29%'

Вы также можете использовать операторы сравнения для дат MySQL, если хотите найти что-то после или до. Это потому, что они написаны таким образом (от наибольшего значения к наименьшему с ведущими нулями), что простая сортировка строк сортирует их правильно.

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