问题是计算通道的总开放时长,只要有任意一个终端开放通道就算开放,难点在于各种终端开放时间重叠包含。
三种思路:
1、先取排序后的第一条数据的时间段为基准,然后两两比较,累加时间。
2、把两两时间串起来,有交集的时间段,直接取最小时间至最大时间,没交集的减去中间不连续的部分。
还有一种思路是求出每个时间段的值,然后减去重叠的时间段。这种过于复杂不考虑,因为重叠的时间段肯定不止重复一次。
第一种实现会在一些嵌套包含的情况下变得复杂,所以无奈只能先过滤那些完全被包含的记录。
第二种实现目前来看代码简洁,思路清晰,而且使用存储过程实现,效率较高。
一、分析
二、代码实现
drop table xcp;
create table xcp(terminal varchar2(2),channel varchar2(2),begin_time date,end_time date);
--问题1、计算总时长,以下为测试数据
insert into xcp values('1','A1',to_date('20200317 01:00:00','yyyymmdd hh24:mi:ss'),to_date('20200317 06:00:00','yyyymmdd hh24:mi:ss'));
insert into xcp values('2','A1',to_date('20200317 01:00:00','yyyymmdd hh24:mi:ss'),to_date('20200317 06:00:00','yyyymmdd hh24:mi:ss'));
insert into xcp values('2','A1',to_date('20200317 01:00:00','yyyymmdd hh24:mi:ss'),to_date('20200317 08:00:00','yyyymmdd hh24:mi:ss'));
insert into xcp values('2','A1',to_date('20200317 02:00:00','yyyymmdd hh24:mi:ss'),to_date('20200317 07:00:00','yyyymmdd hh24:mi:ss'));
insert into xcp values('2','A1',to_date('20200317 03:00:00','yyyymmdd hh24:mi:ss'),to_date('20200317 07:00:00','yyyymmdd hh24:mi:ss'));
insert into xcp val