oracle将时间段按半年拆分,求助一个连续时间段拆分SQL

with t as

(

Select 1 Id,'2013-12-1 1:00' Startdate,'2013-12-2 16:00' Enddate From Dual

UNION ALL

Select 2 Id,'2013-12-3 9:00' Startdate,'2013-12-4 10:00' Enddate From Dual

),

Tmp1 As(

Select Id,To_Date(Startdate,'yyyy-mm-dd hh24:mi') Startdate,

To_Date(ENDDATE,'yyyy-mm-dd hh24:mi') ENDDATE,

To_Char(To_Date(Startdate,'yyyy-mm-dd hh24:mi'),'hh24') Min_S,

To_Char(To_Date(Enddate,'yyyy-mm-dd hh24:mi'),'hh24') Max_E,

Case When To_Number(To_Char(To_Date(Startdate,'yyyy-mm-dd hh24:mi'),'hh24'))<8 Then -1 Else 0 End Left,

Case When To_Number(To_Char(To_Date(Enddate,'yyyy-mm-dd hh24:mi'),'hh24'))>8 Then 1 Else 0 End Right,

trunc(To_Date(enddate,'yyyy-mm-dd hh24:mi')-To_Date(startdate,'yyyy-mm-dd hh24:mi'))  inv

From T )

Select Id,To_Char(Startdate+Left+Level-1,'yyyy-mm-dd') 日期,

Decode(Left,-1,Decode(Level,1,To_Char(Startdate,'yyyy-mm-dd hh24:mi'),To_Char(Startdate+Level-2,'yyyy-mm-dd')||' 08:00'),

0,Decode(Level,1,To_Char(Startdate,'yyyy-mm-dd hh24:mi'),To_Char(Startdate+Level-1,'yyyy-mm-dd')||' 08:00')) 开始日期,

Decode(Left,-1,Decode(Level,Abs(Left)+Right+Inv,To_Char(Enddate,'yyyy-mm-dd hh24:mi'),To_Char(Startdate+Level-1,'yyyy-mm-dd')||' 08:00'),

0,Decode(Level,Abs(Left)+Right+Inv,To_Char(Enddate,'yyyy-mm-dd hh24:mi'),To_Char(Startdate+Level,'yyyy-mm-dd')||' 08:00')) 结束日期

From Tmp1  Connect By Level<=Abs(Left)+Right+Inv and prior id=id

And Prior Dbms_Random.Value Is Not Null

--殊途同归

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值