oracle+连续出现,Oracle合并连续时间段

给出几个时间点,合并Oracle连续的时间点。

例如:

09:00-10:00,10:00-12:00,12:00-16:00 合并输出为09:00-16:00

09:00-10:00,10:00-12:00,12:00-16:00 ,17:00-18:00 输出为09:00-16:00 ,17:00-18:00

09:00-10:00,10:00-12:00,12:00-16:00 ,17:00-18:00,18:00-20:00 输出为 09:00-16:00 ,17:00-20:00

如下是使用lag,lead函数实现:

lag(column,N,defValue):取上一条记录

参数:column 取某列的值

N 取几条,默认取1条

defValue:如果没有取到值,返回该默认值。【比如取第一条的上一条,是取不到值的,如果给了该参数,则返回

该值,,否则为null】

lead(column,N,defValue):取下一条记录

SQL语句如下:

select start_time,lead(priv,1,end_time) over(order by start_time) end_time from (

select start_time,end_time,(start_time-lag(end_time,1,1)over(order by start_time)) diff,

lag(end_time,1,1)over(order by end_time) priv

from (

select replace(substr(a,1,instr(a,'-',1,1)-1),':','') start_time,

replace(substr(a,instr(a,'-',-1,1)+1),':','') end_time

from (

select '09:00-10:00' a from dual union

select '10:00-11:00' a from dual union

select '11:00-12:00' a from dual union

select '13:00-14:00' a from dual union

select '15:00-16:00' a from dual union

select '17:00-18:00' a from dual union

select '18:00-20:00' a from dual union

select '20:00-21:00' a from dual union

select '21:00-22:00' a from dual union

select '23:00-24:00' a from dual union

select '25:00-26:00' a from dual ---这句是额外添加上,当然值只要不在24小时内就行,为了算法需要

)

)

) where diff<>0 and start_time<>'2500'; --2500是25:00的转换值,这里我们需要去掉'25:00-26:00'这条记录

执行结果如下:554f8ee12c9aae3dce9edde138c16372.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值