Записи между СЕЙЧАС () и 3:00 сегодня или вчера

Как я могу получить записи в таблице между СЕЙЧАС () и предыдущим 3:00?

Это было бы легко, если сейчас 9 утра, но как мне написать это, если сейчас 2 часа ночи? т.е. мне нужны сделки между DATE_SUB (CURDATE (), INTERVAL 21 HOURS) и NOW (). Я ищу код, который может делать и то, и другое без необходимости проверять время в пользовательском коде и выбирать между двумя операторами sql.

Я уверен, что есть простое решение, но оно ускользает от меня.


person jmc    schedule 17.12.2015    source источник


Ответы (2)


Простая идея - вычесть три часа и сравнить дату:

where date(date_sub(col, interval 3 hour)) = (case when hour(date) >= 3 then curdate() else date_sub(curdate(), interval 1 day)

Или, более явно, просто проведите сравнение в SQL:

where (hour(date) >= 3 and date(col) = curdate()) or
      (hour(date) < 3 and date(col) = date_sub(curdate(), interval 1 day)
person Gordon Linoff    schedule 17.12.2015
comment
Да, мне нравится идея вычесть 3 часа. Это возвращает нас к размышлениям обо всех транзакциях, которые произошли в день, а не между 3 и 3 часами ночи. - person jmc; 17.12.2015

Я добавлю свой собственный ответ (я, наконец, сдался и исследовал использование IF и обнаружил, что его можно использовать внутри операторов SELECT), но @Gordon Linoff может быть лучше - я понятия не имею, какой из них быстрее.

SELECT IF (NOW() > DATE_ADD(CURDATE(), INTERVAL 3 HOUR),
           DATE_ADD(CURDATE(), INTERVAL 3 HOUR),
           DATE_SUB(CURDATE(), INTERVAL 21 HOUR))

который затем можно использовать как условие для внешнего SELECT.

person jmc    schedule 17.12.2015