SQL между датами, включая даты начала и окончания - PullRequest
12 голосов
/ 02 декабря 2011

Итак, у меня есть это:

 (CURDATE() BETWEEN start_date AND end_date) 

Работает нормально.

Но когда CURDATE() - это 2011-12-02, а end_date - это 2011-12-02, хватит ли оно строки?

Например, моя начальная дата - 2011-12-0100:00:00 и моя дата окончания 2011-12-02 23: 59: 59

Таким образом, он работает только тогда, когда дата находится в промежутке, но не в том случае, если он включен end_date.

Или, может быть, он должен также проверять время, потому что он все еще должен быть выбран с этим запросом, например, 2011-12-02 15:30:00.

Как я могусделать это?

Ответы [ 6 ]

26 голосов
/ 02 декабря 2011

Ну, вы можете попробовать

CURDATE() BETWEEN start_date AND DATE_ADD(end_date, INTERVAL 1 DAY)
4 голосов
/ 28 августа 2015

Возможно, ответ на этот вопрос относится к ошибке в старой версии 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();
4 голосов
/ 02 декабря 2011

Поскольку оба столбца являются временными метками, вам нужно убедиться, что время не сбивает вас с толку. Чтобы время не сбивало вас с толку, приведите отметки времени к дате.

where current_date between cast(start_date as date) 
                       and cast(end_date as date);
2 голосов
/ 02 декабря 2011

Использование start_date <= CURDATE() AND end_date > CURDATE()

1 голос
/ 02 декабря 2011

Это будет работать ... BETWEEN работает с учетом граничных значений. То есть

(CURDATE() BETWEEN start_date AND end_date)

, включая start_date, end_date и любой день, находящийся между

CURDATE() BETWEEN start_date AND ADDDATE(CURDATE(), INTERVAL 1 DAY);
0 голосов
/ 09 сентября 2016

cast (end_date - Start_date с двойной точностью) * 86400

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...