Опираясь на существующий union
cte, мы можем использовать lead()
во внешнем запросе, чтобы получить start_date
следующей записи и извлечь из нее 1
.
with q as (
select date_one start_date from table_one
union select date_two from table_two
union select date_three from table_three
)
select
start_date,
dateadd(day, -1, lead(start_date) over(order by start_date)) end_date
from q
order by start_date
Если тип данных исходных столбцов имеет числовое значение c, то перед применением функций даты необходимо выполнить некоторое приведение:
with q as (
select cast(cast(date_one as varchar(8)) as date) start_date from table_one
union select cast(cast(date_two as varchar(8)) as date) from table_two
union select cast(cast(date_three as varchar(8)) as date) from table_three
)
select
start_date,
dateadd(day, -1, lead(start_date) over(order by start_date)) end_date
from q
order by start_date