MySQL выбор между двумя датами имеет странное поведение

0

Я выбираю все записи между 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
  • 0
    Странный. Все, что я получаю, это синтаксическая ошибка. Можем ли мы увидеть ваши актуальные запросы. :-(
Теги:
datetime
between

2 ответа

3
Лучший ответ

Оператор 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 никогда не может быть истинным, потому что дата не может одновременно быть больше или равна сейчас и меньше, чем сейчас минус одна.

  • 0
    Все ли используют разные версии MySQL для меня? Запросы эквивалентны в том смысле, что они оба выдают одну и ту же синтаксическую ошибку. !?!
  • 0
    @Strawberry Спасибо за исправление . Я думаю, мы не можем предположить, что что-либо в любом ОП действительно работает априори. Возможно, OP сделал опечатку при копировании в Stack Overflow.
Показать ещё 1 комментарий
0

Проще говоря,

Для SQL: WHERE x between a and b означает

x >= a и x <= b

поэтому мы имеем a <= x <= b или a <= b

PS: это всего лишь математика :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню