当前位置: 代码迷 >> Oracle管理 >> 怎么判断一段日期在其他几段日期之和的范围内
  详细解决方案

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

热度:272   发布时间:2016-04-24 04:05:32.0
如何判断一段日期在其他几段日期之和的范围内?
具体情况如下;首先有几段日期,如 
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 < v_sdate, v_sdate, sdate) AS sdate,
               DCODE(edate < v_edate, v_edate, edate) AS 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 < v_sdate THEN v_sdate ELSE sdate END) AS sdate,
               (CASE WHEN edate < v_edate THEN v_edate ELSE edate END) AS 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)。
  相关解决方案