具体情况如下;首先有几段日期,如
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) 判相等。
------解决思路----------------------
简单点只看前两条记录,因为是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)。