如何判断一段日期在其他几段日期之和的范围内?
具体情况如下;首先有几段日期,如
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)。