Я выбираю все записи между NOW() и конкретным интервалом X-дня и наткнулся на это странное поведение, которое я не понимаю.
Я проверяю 24 часа в будущее и 24 часа в прошлое:
select * from table where date between NOW() and NOW() + 1 interval day; //works
select * from table where date between NOW() and NOW() - 1 interval day; //no records
Но если я перепутаю between
вызовами:
select * from table where date between NOW() + 1 interval day AND NOW(); //no records
select * from table where date between NOW() - 1 interval day AND NOW(); //works
Почему вы звоните в будущую работу, но тот же звонок в прошлом не работает?... и если я перехожу between
параметров, происходит противоположное поведение - не работает 24 часа в будущее, но работает 24 часа в прошлое,
======================
Добавление объяснения @TimBiegeleisen ниже здесь выписано:
date = '2018-05-30' ;
select * from table where date between NOW() and NOW() + 1 interval day;
= date >= '2018-05-30' AND 'date <= 2018-05-31'; //true
select * from table where date between NOW() and NOW() - 1 interval day; records
= date >= '2018-05-30' AND 'date <= 2018-05-29'; //false
А ТАКЖЕ
select * from table where date between NOW() + 1 interval day AND NOW();
= date >= '2018-05-31' AND date <= '2018-05-30' //false
select * from table where date between NOW() - 1 interval day AND NOW();
= date >= '2018-05-29' and date <= '2018-05-30'; //true
Оператор BETWEEN
интерпретируется определенным образом:
WHERE date BETWEEN a AND b
означает следующее:
WHERE date >= a AND date <= b
Таким образом, следующие два запроса эквивалентны:
select * from table where date between NOW() and NOW() - interval 1 day;
select * from table where date >= NOW() and date <= NOW() - interval 1 day;
Надеюсь, вы увидите, что во втором запросе условие WHERE
никогда не может быть истинным, потому что дата не может одновременно быть больше или равна сейчас и меньше, чем сейчас минус одна.
Проще говоря,
Для SQL: WHERE x between a and b
означает
x >= a
и x <= b
поэтому мы имеем a <= x <= b
или a <= b
PS: это всего лишь математика :)