Проверьте, находится ли неделя дат между двумя конкретными датами SQL ORACLE - PullRequest
0 голосов
/ 29 мая 2019

У меня есть две даты, и я хочу сохранить только те строки, где определенная неделя находится между этими двумя датами. Мне нужно запускать это в течение 67+ различных недель, поэтому я хотел бы изменить код ниже, чтобы он выполнялся быстрее и не приходилось каждый раз печатать 7 дней недели.

SELECT * FROM MY_DATA
WHERE  ('05-JUNE-2017' BETWEEN start_date AND end_date
OR      '06-JUNE-2017' BETWEEN start_date AND end_date
OR      '07-JUNE-2017' BETWEEN start_date AND end_date
OR      '08-JUNE-2017' BETWEEN start_date AND end_date
OR      '09-JUNE-2017' BETWEEN start_date AND end_date
OR      '10-JUNE-2017' BETWEEN start_date AND end_date
OR      '11-JUNE-2017' BETWEEN start_date AND end_date);

Ответы [ 3 ]

4 голосов
/ 29 мая 2019

Итак, у вас есть два интервала дат.Один от input_date до input_date + 6 (примечание: 6, а не 7; вы тоже учитываете input_date!), А другой от start_date до end_date.И вы хотите написать условие, которое означает, что два интервала перекрываются (имеют непустое пересечение).

Два интервала перекрывают , а не , если один полностью предшествует другому.Таким образом, последний день одного интервала должен быть строго меньше, чем первый день другого интервала.Это может произойти одним из двух способов (в зависимости от , который интервал идет первым).Условие будет выглядеть так:

input_date + 6 < start_date OR end_date < input_date

Итак, это отрицание того состояния, которое вы хотите.Примените к этому логический оператор NOT;таким образом, условие становится:

input_date + 6 >= start_date AND end_date >= input_date
0 голосов
/ 29 мая 2019

Я думаю, вы ищете что-то вроде следующего:

WITH weeks AS (SELECT TO_DATE('05-07-2017', 'DD-MM-RRRR') + LEVEL * 7 - 7 week_start
                    , TO_DATE('05-07-2017', 'DD-MM-RRRR') + LEVEL * 7 - 1 week_end
                 FROM dual
                 CONNECT BY LEVEL < 50)
SELECT * 
  FROM MY_DATA
  JOIN WEEKS
    ON MY_DATA.end_date   >= weeks.week_start
   AND MY_DATA.start_date <= weeks.week_end

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

0 голосов
/ 29 мая 2019

Я думаю, что ваш запрос эквивалентен

SELECT * FROM MY_DATA WHERE  ('05-JUNE-2017' BETWEEN start_date - 6 AND end_date );

, где '05-JUNE-2017' - начальный день недели, которую вы ищете.

Теперь вы должны сделать это для всехдни первой недели ...

Это то, что вы ищете?

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