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%'
Похоже на то, что сказал Юджин Рикс. Если вы используете 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);