Here's one way to solve it:
Store every day a user is scheduled to work. With a column to state if this is holiday or not, e.g.:
create table employee_work (
employee_id integer
not null,
working_day date
not null
check ( working_day = trunc ( working_day ) ),
is_holiday integer
default 0
not null
check ( is_holiday in ( 0, 1 ) ),
primary key (
employee_id, working_day
)
);
Load it up with every employee's working days as needed.
With this in place, when they request holiday run:
update employees
set is_holiday = 1
where employee_id = :emp
and working_day between to_date ( :start_dt, <fmt> )
and to_date ( :end_dt, <fmt> );
And if they want to cancel days within a holiday period, set those days back to "not holiday" in the range:
update employees
set is_holiday = 0
where employee_id = :emp
and working_day between to_date ( :start_dt, <fmt> )
and to_date ( :end_dt, <fmt> );
This avoids the need to do any manipulation of the existing date ranges.
If you want to show someone which days they have booked holiday, run:
select * from employees
where employee_id = :emp
and is_holiday = 1