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