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

PL/SQL计算开始/结束日期差之和,sql,oracle,date,sum,Sql,Oracle,Date,Sum,我有一个表,上面有缺勤的开始和结束日期,我想得到按id和月份分组的缺勤天数之和。我通过计算日期+1之间的差异来实现这一点。问题是,有时日期和时间段相互重叠。以下是一个例子: 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

我有一个表,上面有缺勤的开始和结束日期,我想得到按id和月份分组的缺勤天数之和。我通过计算日期+1之间的差异来实现这一点。问题是,有时日期和时间段相互重叠。以下是一个例子:

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环境中是否有任何方法可以处理此类问题?
谢谢你的回答

一个简单的方法是获取一个范围内的日期列表并进行检查。例如:

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;

预期输出是什么?预期结果请说明您是如何存储数据的?为什么要这样存储数据?如果已经有2016年2月7日至2016年2月20日期间的条目,那么需要在2016年2月8日至2016年2月14日期间进行另一个条目吗?@Keyur Panchal我正在从外国人创建的数据库中提取原始数据。对于一个人,日期范围分配给不同类型的缺勤标签contracts@XING&Vecchiasinora预期结果已编辑。我将使用dual connect by rownum中的选择日期“2016-02-01”+rownum-1,而不是依赖于所有的_对象(此处的行数为73k)