2010-05-03 5 views
62

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

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

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

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

Любые предложения? Благодарю.

ответ

111

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

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

Просто для справки У меня есть 2 миллиона запись таблицы, я побежал подобный запрос. Ответы на сальсы заняли 4,48 секунды, выше было 2,25 секунды.

Итак, если стол БОЛЬШОЙ, я бы предложил это скорее.

+3

Первый ответ настолько медленный, потому что он должен отформатировать каждое datetime в строку перед сравнением. Это лучше, потому что он напрямую сравнивает только поле даты с полем, но он все еще не может использовать индекс (проверенный на mysql 5.1). – Marki555

+1

Если производительность является проблемой, возможно, стоит рассмотреть возможность хранения даты и времени отдельно, чтобы ИНДЕКС может быть помещен на дату. –

-5
SELECT * FROM `calendar` WHERE startTime like '2010-04-29%' 

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

+0

Это решение делает грубую работу на вопрос .... – ravisoni

+0

Почему этот ответ так проголосовали? Может ли кто-нибудь объяснить? – brazorf

+0

В моем случае не работает –

18
SELECT * FROM `calendar` WHERE DATE_FORMAT(startTime, "%Y-%m-%d") = '2010-04-29'" 

ИЛИ

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

Это ужасный запрос. Избегайте этого любой ценой. Если в startTime есть индекс, он не может использоваться этим запросом, поскольку он применяет функцию к столбцу, а не использует его напрямую. Это означает, что для любого такого запроса потребуется полное сканирование таблицы. На большой таблице это будет означать чрезвычайно медленный запрос. – steveayre

+0

Согласен, его ответ ** неправильный ** - правильный ответ был опубликован Дэвидом ниже. –

+1

Пожалуйста, используйте ответ от Дэвида, потому что это намного быстрее. Этот показатель действителен, но не подходит для скорости ... –

25

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

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

+0

Слишком сложно - см. Правильный ответ Дэвида ниже. –

+4

Версия Дэвида не очень хороша, она не может использовать индексы. Чтобы использовать индекс, вам нужно напрямую фильтровать столбец, а не результат функции ('date()', 'year()', 'lateiff()' или любые аналогичные) – Marki555

+0

Я искал, как mysql конвертирует дату в datetime, спасибо за ее очистку добавляет '00: 00: 00'. теперь мои результаты имеют смысл –

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

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

1
SELECT * FROM sample_table WHERE last_visit = DATE_FORMAT('2014-11-24 10:48:09','%Y-%m-%d %H:%i:%s') 

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