Возможно, ответ на этот вопрос относится к ошибке в старой версии MySql, потому что between
включает , что означает, что он будет захватывать строки между датами начала и окончания включительно, а не только междуначало и за один день до конца.
Попробуйте:
SELECT CURDATE() BETWEEN CURDATE() AND CURDATE();
Результат равен 1
(т.е. true
).Я полагаю, что исходная проблема постера заключается в смешивании правильных дат (DATE
) и дат со временем (DATETIME
или TIMESTAMP
).
Попробуйте это:
SELECT NOW() BETWEEN CURDATE() AND CURDATE();
SELECT NOW() BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 1 DAY);
результат 0
для первого выбора и 1
для второго.То, что произошло, DATE
эквивалентно DATETIME
с нулевым временем, поэтому, если NOW()
не будет вызвано ровно в полночь, оно будет больше CURDATE()
и выйдет за пределы оператора BETWEEN
.Для предотвращения этого теста только DATE
часть DATETIME
, использующая функцию DATE()
:
SELECT DATE(NOW()) BETWEEN CURDATE() AND CURDATE();