Каков фактический тип данных столбца created_at
?
Этот ответ будет игнорировать эту причудливость в формате с запятыми и предполагать, что это не данные типа символов и что это DATETIME
или TIMESTAMP
.
Нормативный шаблон для предикатов в столбцах DATETIME
и TIMESTAMP
представляет собой сравнение диапазонов.
Например, чтобы получить все значения datetimecol 10 июня, тогда что-то вроде этого:
WHERE t.datetimecol >= '2019-06-10 00:00:00'
AND t.datetimecol < '2019-06-11 00:00:00'
Как правило, я просто передаю это значение даты и позволяю MySQL вычислить следующий день. Если мы пропустим часть времени, MySQL примет 00:00:00
WHERE t.datetimecol >= '2019-06-10' + INTERVAL 0 DAY
AND t.datetimecol < '2019-06-10' + INTERVAL 1 DAY
Для повышения производительности, чтобы MySQL эффективно использовал операцию сканирования диапазона с подходящим индексом, мы хотим избегать переноса ссылки на столбец в функции. То есть, указав DATE(t.datetimecol)
в условии в предложении WHERE, вынудите MySQL вычислять функцию DATE()
в каждой строке таблицы.
Со ссылками на пустой столбец, который позволяет MySQL использовать индекс, если подходящий индекс доступен.
* * Например, тысяча двадцать восемь
SELECT e.*
FROM tabl.error_logs e
WHERE e.created_at >= DATE(NOW()) + INTERVAL -3 DAY
AND e.created_at < DATE(NOW()) + INTERVAL -2 DAY
обратите внимание, что мы можем легко протестировать эти выражения в предложении WHERE, убедиться, что они возвращают то, что нам нужно, и настроить при необходимости:
SELECT DATE(NOW()) + INTERVAL -3 DAY
, DATE(NOW()) + INTERVAL -2 DAY