How to get all the dates between start_date and end_date, including start_date and end_date?
But not those dates that do not fall in the range.
eg: 08-01-2020 should not be in the output because it is not in any of the work_id dates range so 08-01-2020 is one of the non-working dates
So I want all the dates except the non-working dates.
Sample output : either this
or this
Advertisement
Answer
Create a list of dates of target range, add working and non-working flags to the list, and filter by the flag. You can get the expected output with the following query.
x
-- 1st, generate a list of dates
with dates as (
select min(start_date) as dates, max(end_date) as max_date from dates_range
union all
select dateadd(day, 1, dates), max_date from dates
where dates < max_date
),
-- 2nd, generate a list of dates with working/non working flag
all_dates as (
select distinct
d1.dates,
case when d2.work_id is not null then 'true' else 'false' end as working
from dates as d1 left outer join dates_range as d2
on d1.dates between d2.start_date and d2.end_date
)
-- 3rd, filter either that working is true or false
select dates as Non_working_dates from all_dates where working = 'false';