Możesz użyć Rekursywny faktoring podzapytań aby wygenerować interwały:
with tbl as (
select to_date('1/28/2020 11:51', 'MM/DD/YYYY HH24:MI') as color_date, 'red' as color from dual union
select to_date('2/3/2020 11:51', 'MM/DD/YYYY HH24:MI') as color_date, 'red' as color from dual union
select to_date('2/6/2020 11:51', 'MM/DD/YYYY HH24:MI') as color_date, 'red' as color from dual union
select to_date('4/16/2020 11:51', 'MM/DD/YYYY HH24:MI') as color_date, 'blue' as color from dual union
select to_date('4/19/2020 11:51', 'MM/DD/YYYY HH24:MI') as color_date, 'blue' as color from dual union
select to_date('4/23/2020 11:51', 'MM/DD/YYYY HH24:MI') as color_date, 'blue' as color from dual union
select to_date('5/2/2020 11:51', 'MM/DD/YYYY HH24:MI') as color_date, 'blue' as color from dual
),
tbl_min_max as (
select t.color, min(trunc(color_date)) begin_interval, max(trunc(color_date)) end_interval from tbl t group by t.color
),
tbl_interval(color, begin_interval, end_interval, color_date) as (
select color, begin_interval, end_interval, begin_interval from tbl_min_max
union all
select color, begin_interval, end_interval, color_date + 1 from tbl_interval where color_date < end_interval
)
select
t.color, t.color_date
from
tbl_interval t
order by
t.color, t.color_date