MySQL SELECT WHERE datetime соответствует день (и не обязательно время)

У меня есть таблица, которая содержит столбец datetime. Я хочу вернуть все записи того или иного дня, независимо от времени. Или, другими словами, если моя таблица содержит только 4 записи, тогда только 2-й и 3-й будут возвращены, если я ограничу 2012-12-25.

2012-12-24 00:00:00
2012-12-25 00:00:00
2012-12-25 06:00:00
2012-12-26 05:00:00

Ответ 1

НИКОГДА НИКОГДА использовать селектор типа DATE(datecolumns) = '2012-12-24' - это убийца производительности:

  • он рассчитает DATE() для всех строк, включая те, которые не соответствуют
  • это сделает невозможным использование индекса для запроса

Гораздо быстрее использовать

SELECT * FROM tablename 
WHERE columname BETWEEN '2012-12-25 00:00:00' AND '2012-12-25 23:59:59'

поскольку это позволит использовать индекс без вычисления.

ИЗМЕНИТЬ

Как указано в Used_By_Already, за время, прошедшее после ответного ответа в 2012 году, появились версии MySQL, где использование "23: 59: 59" в качестве дневного конца более не безопасно. Обновленная версия должна читать

SELECT * FROM tablename 
WHERE columname >='2012-12-25 00:00:00'
AND columname <'2012-12-26 00:00:00'

Суть ответа, т.е. избегание селектора по вычисленному выражению, конечно же, остается.

Ответ 2

... WHERE date_column >='2012-12-25' AND date_column <'2012-12-26' может потенциально работать лучше (если у вас есть указатель на date_column), чем DATE.

Ответ 3

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

SELECT * FROM datetable WHERE datecol LIKE '2012-12-25%'