2016-01-16 2 views
0

У меня есть дата начала (l_start_date), дата окончания (l_end_date) и даты (l_date) в базе данных.Как фильтровать даты в mysql?

Например, Пользователь выбирает дату начала 15-01-2016 и дату окончания 30-01-2016. Как я могу получить все строки даты (l_date), которая содержит дату между выбранной пользователем датой начала и датой окончания?

Меня поразили: На изображении ниже (l_date), 2016-01-29, 2016-01-30, 2016-02-01, 2016-02-02. здесь, как я могу получить эту строку тоже, потому что пользовательский диапазон до 2016-01-30, но дата окончания (l_end_date), я сохранил 2016-02-02, поэтому его игнорирование.

enter image description here

Я пробовал:

SELECT l_date,l_start_date,l_end_date 
    FROM `dates` 
    WHERE (l_end_date >= '2016-01-15' or l_end_date <= '2016-01-15') AND 
     (l_start_date >= '2016-01-15' or l_end_date <= '2016-01-15') AND 
     (l_end_date >= '2016-01-30' or l_end_date <= '2016-01-30') AND 
     (l_start_date >= '2016-01-30' or l_end_date <= '2016-01-30') 
+1

Кажется похож на этот: http://stackoverflow.com/questions/5125076/sql-query-to-select-dates-between-two- даты – SenselessCoder

ответ

1

Вы можете использовать следующую логику:

where l_end_date >= '2016-01-15' and -- the input start date 
     l_start_date <= '2016-01-30'  -- the input stop date 

Правило простое. Два интервала перекрываются, если они начинаются до второго конца. И первый заканчивается после второго запуска.

Для полного перекрытия, логика немного отличается:

where l_end_date >= '2016-01-30' and -- the input stop date 
     l_start_date <= '2016-01-15'  -- the input start date 

Также отметим, что неравенство может быть строгие неравенства («<» и „>“), в зависимости от того, как определены интервалы.

0

Ответ дается @Gordon Linoff объясняет это очень хорошо, но переводить в контекст можно понять:

ваши критерии не является критерием вообще.

(l_end_date >= '2016-01-15' or l_end_date <= '2016-01-15') 

возвращает все записи, потому что, если end_date не> = это < = дата окончания, это логика. То же самое касается следующих строк. Таким образом, у вас на самом деле нет предложения where. Ключевым словом здесь является или.

Попробуйте запрос предоставленный @Gordon Linoff

SELECT l_date,l_start_date,l_end_date 
    FROM `dates` 
    where l_end_date >= '2016-01-30' and -- the input stop date 
     l_start_date <= '2016-01-15'  -- the input start date 
Смежные вопросы