开始/结束的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环境这样的问题? 感谢您的回答!
答
一个简单的方法是让日期列表的范围和检查。例如:
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
什么是预期的输出? – XING
预期结果请 – Vecchiasignora
如何存储数据?为什么你要存储这样的数据?如果从2016年2月7日至2016年2月20日已有条目,那么需要在2016年2月8日至2016年2月14日之间再次进行登录? –