oracle匹配日期段内的,怎么判断一段日期在其他几段日期之和的范围内

如何判断一段日期在其他几段日期之和的范围内?

具体情况如下;首先有几段日期,如

2015-01-01 至 2015-03-01

2015-03-05 至 2015-06-01

2015-06-02 至 2015-09-01

2015-09-11 至 2017-01-01

假设现在进来一段日期, 2015-01-02 至 2015-12-11 我要判断这段日期是否在上面4段日期范围合计内?

这样的sql该如何写勒。上面几段日期的合计可能存在不包含的日期,如2015-03-04 不在这些日期合计范围内。

------解决思路----------------------

既然几段日期不交叉,用下面的方式。否则 t 需要用递归切掉重复部分。

假定  2015-01-02 、2015-12-11 已经放入变量 v_sdate、v_edate。

用下面求的的 listDays 和 (v_edate - v_sdate) 判相等。

SELECT SUM(edate - sdate) AS listDays

FROM (

SELECT DCODE(sdate 

DCODE(edate 

FROM table1

WHERE sdate BETWEEN v_sdate AND v_edate

OR edate BETWEEN v_sdate AND v_edate

) AS t

------解决思路----------------------

我用错 DECODE() 了,应该用 CASE 语句的。

SELECT (CASE WHEN sdate 

(CASE WHEN edate 

------解决思路----------------------

试一下下面的语句,如果有返回结果,就不在范围内。如果没返回,则在范围内。

with table1 as

(

select to_date('2015-01-01', 'yyyy-mm-dd') begindate, to_date('2015-03-01', 'yyyy-mm-dd') enddate from dual union all

select to_date('2015-03-05', 'yyyy-mm-dd') begindate, to_date('2015-06-01', 'yyyy-mm-dd') enddate from dual union all

select to_date('2015-06-02', 'yyyy-mm-dd') begindate, to_date('2015-09-01', 'yyyy-mm-dd') enddate from dual union all

select to_date('2015-09-11', 'yyyy-mm-dd') begindate, to_date('2017-01-01', 'yyyy-mm-dd') enddate from dual

)

select * from

(select rownum rn, begindate, enddate from table1 where enddate>=to_date('2015-01-02', 'yyyy-mm-dd') and begindate<=to_date('2015-12-11', 'yyyy-mm-dd')) aa

left join

(select rownum rn, begindate, enddate from table1 where enddate>=to_date('2015-01-02', 'yyyy-mm-dd') and begindate<=to_date('2015-12-11', 'yyyy-mm-dd')) bb

on aa.rn=bb.rn-1

where bb.rn is not null and bb.begindate>aa.enddate+1

------解决思路----------------------

引用:这样算出的天数只差,怎么判断给出的日期是否符合要求勒。。

listDays 和 (v_edate - v_sdate) 判相等。

------解决思路----------------------

引用:Quote: 引用:试一下下面的语句,如果有返回结果,就不在范围内。如果没返回,则在范围内。

with table1 as

(

select to_date('2015-01-01', 'yyyy-mm-dd') begindate, to_date('2015-03-01', 'yyyy-mm-dd') enddate from dual union all

select to_date('2015-03-05', 'yyyy-mm-dd') begindate, to_date('2015-06-01', 'yyyy-mm-dd') enddate from dual union all

select to_date('2015-06-02', 'yyyy-mm-dd') begindate, to_date('2015-09-01', 'yyyy-mm-dd') enddate from dual union all

select to_date('2015-09-11', 'yyyy-mm-dd') begindate, to_date('2017-01-01', 'yyyy-mm-dd') enddate from dual

)

select * from

(select rownum rn, begindate, enddate from table1 where enddate>=to_date('2015-01-02', 'yyyy-mm-dd') and begindate<=to_date('2015-12-11', 'yyyy-mm-dd')) aa

left join

(select rownum rn, begindate, enddate from table1 where enddate>=to_date('2015-01-02', 'yyyy-mm-dd') and begindate<=to_date('2015-12-11', 'yyyy-mm-dd')) bb

on aa.rn=bb.rn-1

where bb.rn is not null and bb.begindate>aa.enddate+1

最后 where 条件 应该改成 where bb.rn is not null and aa.begindate>bb.enddate+1 吧

简单点只看前两条记录,因为是aa.rn=bb.rn-1,所以,aa对应的是第一条记录,bb对应的是第二条记录,bb.begindate>aa.enddate+1就是判断第一条记录的结束日期“2015-03-01”和第二条记录的开始日期“2015-03-05”是否连续。

如果是“aa.begindate>bb.enddate+1”这个判断,那按现在的数据中,这个判断永远不成立,因为第一条记录的开始日期肯定会小于第二条的结束日期。

------解决思路----------------------

引用:日期连贯起来后 算出来的日期天数 也还相差一天额

如果你的时间段定义是包含 edate 这天的,那么算天数要加一天 (edate - sdate + 1)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值