Try;
WITH date_tbl AS ( --get (max end_date diff) group by START_DATE
SELECT
Trunc(START_DATE) Min_date,
max(Trunc(END_DATE)) - Trunc(START_DATE) diff
FROM tbl
GROUP BY Trunc(START_DATE)
),
num_tbl AS ( --data to join the table [0 , 1, 2, 3 ..... max(diff) + 1]
SELECT LEVEL - 1 lev
FROM dual
CONNECT BY LEVEL <= (SELECT Max(diff) + 1 FROM date_tbl)
)
SELECT DISTINCT Min_date + lev date_col --adding level to get all date
FROM num_tbl JOIN date_tbl
ON lev <= diff
ORDER BY Min_date + lev
Demo
with tbl(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-04' 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
),
date_tbl AS ( --get max end_date group by START_DATE
SELECT
Trunc(START_DATE) Min_date,
max(Trunc(END_DATE)) - Trunc(START_DATE) diff
FROM tbl
GROUP BY Trunc(START_DATE)
),
num_tbl AS ( --data to join the table [0 ,1 , 2, 3 ..... max(diff) + 1]
SELECT LEVEL - 1 lev
FROM dual
CONNECT BY LEVEL <= (SELECT Max(diff) + 1 FROM date_tbl)
)
SELECT DISTINCT Min_date + lev date_col
FROM num_tbl JOIN date_tbl
ON lev <= diff
ORDER BY Min_date + lev
OutPut
DATE_COL
01.02.2016
02.02.2016
03.02.2016
04.02.2016
05.02.2016
11.02.2016
12.02.2016
13.02.2016
14.02.2016