Query:
with y(start_date, end_date, m) as (
select start_date, end_date, case when start_date > lag(end_date) over (order by start_date, end_date) then 1 else 0 end
from your_table
)
,z(start_date, end_date, group_number) as (
select start_date, end_date, sum(m) over (order by start_date, end_date) from y
)
,a(start_date, end_date, group_number) as (
select min(start_date), max(end_date), group_number
from z
group by group_number
)
select start_date + level - 1
from a
connect by start_date + level - 1 <= end_date
and prior group_number = group_number
and prior SYS_GUID() is not null
order by 1;
Example:
with x(start_date, end_date) as (
select date'2016-02-01', date'2016-02-03' from dual union all
select date'2016-02-01', date'2016-02-05' from dual union all
select date'2016-02-01', date'2016-02-03' from dual union all
select date'2016-02-11', date'2016-02-14' from dual union all
select date'2016-02-02', date'2016-02-07' from dual union all
select date'2016-02-02', date'2016-02-05' from dual union all
select date'2016-02-12', date'2016-02-15' from dual union all
select date'2016-02-11', date'2016-02-17' from dual union all
select date'2016-02-19', date'2016-02-21' from dual
)
,y(start_date, end_date, m) as (
select start_date, end_date, case when start_date > lag(end_date) over (order by start_date, end_date) then 1 else 0 end
from x
)
,z(start_date, end_date, group_number) as (
select start_date, end_date, sum(m) over (order by start_date, end_date) from y
)
,a(start_date, end_date, group_number) as (
select min(start_date), max(end_date), group_number
from z
group by group_number
)
select start_date + level - 1
from a
connect by start_date + level - 1 <= end_date
and prior group_number = group_number
and prior SYS_GUID() is not null
order by 1;
Result:
start_date + level - 1
----------------------
01-FEB-16
02-FEB-16
03-FEB-16
04-FEB-16
05-FEB-16
06-FEB-16
07-FEB-16
11-FEB-16
12-FEB-16
13-FEB-16
14-FEB-16
15-FEB-16
16-FEB-16
17-FEB-16
19-FEB-16
20-FEB-16
21-FEB-16