开始/结束的PL/SQL和计算日期差异

问题描述:

我有缺课的开始和结束日期表,我想通过ID和分组每月旷工天数的总和。我通过计算日期+1之间的差异来做到这一点。问题在于有时日期时间段彼此重叠。这里有一个例子:开始/结束的PL/SQL和计算日期差异

ID ABS_START ABS_END  NBR_ABS 

5 04/02/2016 04/02/2016   1 
5 05/02/2016 05/02/2016   1 
5 06/02/2016 07/02/2016   2 
5 07/02/2016 20/02/2016   14 
5 08/02/2016 14/02/2016   7 

NBR_ABS = number of absences relative to dates period 

预期结果:

ID ABS_MONTH NBR_ABS_MONTH 

5 2016/02   17 
6 2016/02   0 
7 2016/02   5 
8 2016/02   13 
9 2016/02   2 

NBRE_ABS_MONTH = number of absences by id for whole month 

有什么办法来应对Oracle环境这样的问题? 感谢您的回答!

+0

什么是预期的输出? – XING

+0

预期结果请 – Vecchiasignora

+0

如何存储数据?为什么你要存储这样的数据?如果从2016年2月7日至2016年2月20日已有条目,那么需要在2016年2月8日至2016年2月14日之间再次进行登录? –

一个简单的方法是让日期列表的范围和检查。例如:

with dates as (
     select (date '2016-02-01') + rownum - 1 
     from all_objects 
     where rownum <= 29 
    ) 
select i.id, count(*) as absence_201602 
from dates cross join 
    (select distinct id from t) i 
where exists (select 1 
       from t 
       where t.id = i.id and 
        d.date between t.abs_start and t.abs_end 
      ) 
group by id; 
+0

而不是依靠ALL_OBJECTS的,其具有的行的数量有限(这里〜73K),我会用'选择(日期“2016年2月1日”)+ ROWNUM - 从双1通过ROWNUM