Мне нужно получить все даты от DATE_FROM
до DATE_TO
каждого ID
таблицы LEAVE
, исключая выходные, рабочие отстранения и праздничные дни.Учитывая эту запись (ID
, DATE_FROM
, DATE_TO
):
001 04-OCT-2018 09-OCT-2018
002 05-OCT-2018 05-OCT-2018
...
n 01-OCT-2018 05-OCT-2018
Мне нужно получить все даты между этими диапазонами в этом формате (ID
, DAY_TOKEN
):
001 04-OCT-2018
001 05-OCT-2018
001 08-OCT-2018
001 09-OCT-2018
002 05-OCT-2018
...
n 01-OCT-2018
n 02-OCT-2018
n 03-OCT-2018
n 04-OCT-2018
n 05-OCT-2018
Я использую этот запрос, модифицированный из найденных мной запросов:
SELECT ID, a.date_from + rnum - 1 AS day_token
FROM (SELECT a.ID, a.date_from, a.date_to, ROWNUM AS rnum
FROM all_objects, leave a
-- Aside from ALL_OBJECT, I cross join it with my LEAVE table
WHERE ROWNUM <= a.date_to - a.date_from + 1) a
WHERE TO_CHAR (a.date_from + rnum - 1, 'DY') NOT IN ('SAT', 'SUN');
AND NOT EXISTS (SELECT 1
FROM holiday b
WHERE b.schedule = d.date_from + rnum - 1)
AND NOT EXISTS (SELECT 1
FROM suspension c
WHERE c.schedule = d.date_from + rnum - 1)
Проблема заключается в том, что только первая запись будет расширена должным образом, а другие записи не будут включены внабор записей, если только DATE_FROM
и DATE_TO
не имеют одинаковую дату.
Я хочу избегать максимально возможного использования функции PL-SQL, но если невозможно добиться нужного мне набора результатов без использованияфункция, пожалуйста, сообщите мне хотя бы причину.