выбрать данные на конкретную дату - PullRequest
0 голосов
/ 11 июня 2019

Я хочу получить записи из дБ в соответствии с указанным мной форматом даты ГГГГ, ММ, дд, но тип столбца: ГГГГ, ММ, дд чч: мм: сс.

пытался использовать функцию формата даты

SELECT * 
  FROM tabl.error_logs 
 where created_at = DATE_FORMAT(NOW(),'%Y-%m-%d'- INTERVAL 3 DAY);

Я ожидаю, что созданная дата будет 2019-06-08, но результат будет пустым

Ответы [ 3 ]

1 голос
/ 11 июня 2019

Чтобы сделать запрос sargable , вам нужно ...

SELECT * 
  FROM tabl.error_logs 
 WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL 3 DAY)
  AND created_at <  DATE_SUB(CURDATE(), INTERVAL 2 DAY)

Выбирает все значения created_at в полночь три дня назад или позже, вплоть до полуночи < два дня назад, но не включая ее. Он использует сканирование диапазона по индексу на created_at, если он доступен.

1 голос
/ 11 июня 2019

Каков фактический тип данных столбца 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
0 голосов
/ 11 июня 2019

Вы можете использовать date_sub ()

SELECT * 
FROM tabl.error_logs 
where date(created_at) = DATE_SUB(date(now()), INTERVAL 3 DAY);

если столбец create_at является датой, тогда можно было бы избежать функции date () и позволить индексу (если он есть) работать для этого столбца

SELECT * 
FROM tabl.error_logs 
where created_at = DATE_SUB(date(now()), INTERVAL 3 DAY);
...