Как мне это сделать ? Временной интервал - PullRequest
0 голосов
/ 09 марта 2020

есть таблица.

(1, 'b', '2010-01-01 00:00:00', '2020-01-01 00:00:00'),
(1, 'z', '2010-02-01 00:00:00', '2015-01-01 00:00:00'),

Как это сделать:

(1, 'b', '2010-01-01 00:00:00', '2010-01-31 23:59:59'),
(1, 'z', '2010-02-01 00:00:00', '2015-01-01 00:00:00'),
(1, 'b', '2015-01-01 00:00:01', '2020-01-01 00:00:00');

1 Ответ

1 голос
/ 10 марта 2020

Вы можете сделать это следующим образом: я добавляю часть, когда вы убираете секунду из конечной даты или добавляете секунду к исходной дате, так как я не видел лог c там

with cte as
(
select 1 as a, 'b' as b, cast('2010-01-01 00:00:00'as date) as start_, cast('2020-01-01 00:00:00'as date) as end_
union select 1, 'z', '2010-02-01 00:00:00', '2015-01-01 00:00:00' 
),
cte2 as
(
select start_ as date_ from cte union select end_ from cte
),
cte3 as
(
select a, b, date_ from cte2 a inner join cte b on date_ between start_ and end_ 
),
final as
(
select a.a, a.b, a.date_ as startdate, 
case when a.b = lead(a.b)over(order by a.date_) then lead(a.date_)over(order by a.date_) end as enddate
from cte3 a 
) 
select * from final where enddate is not null order by startdate

Выход:

a   b   startdate   enddate
1   b   2010-01-01  2010-02-01
1   z   2010-02-01  2015-01-01
1   b   2015-01-01  2020-01-01
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...