sql时间段取并集、合并

本文讨论如何计算通道总开放时长,即使任一终端开启通道也算开放。重点在于处理时间重叠的情况。提出了两种解决方案:1) 通过比较累加时间;2) 串联时间并处理交集。第二种方法因代码简洁、效率高而被推荐。
摘要由CSDN通过智能技术生成

问题是计算通道的总开放时长,只要有任意一个终端开放通道就算开放,难点在于各种终端开放时间重叠包含。

三种思路:

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
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值