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

5 ответов

Решение

НИКОГДА не используйте селектор, как 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'

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

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

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

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

ВЫБРАТЬ ИЗ table где Date(col) = 'date'

Похоже на то, что сказал Юджин Рикс. Если вы используете spring data/jpa с Java 8 и выше, вы можете использовать plusDays(долгие часы), чтобы увеличить день с 25 до 26.

Пример:

      LocalDateTime lowerDateTime=LocalDateTime.parse("2012-12-25T00:00:00");
LocalDateTime upperDateTime = lowerDateTime.plusDays(1l);
System.out.println("my lowerDate =="+lowerDateTime);
System.out.println("my upperDate=="+upperDateTime);
Другие вопросы по тегам