抱歉,标题…最好用一个例子来描述问题…
我有一个事件列表和每个事件的两个日期,我需要在各自的月份内“中断”或“分发”这些日期。
范例1:
事件 :事件A
开始日期 :12/15/2017-MM / DD / YYYY
结束日期 :2018年1 月 17 日 -MM / DD / YYYY
如果在表上搜索此事件,则会得到包含该数据的结果行。
但是我需要两个结果,如下所示:
结果1:事件A > 15到31
结果2:事件A > 01至17
范例2:
事件 :事件B
开始日期 :02/07/2018-MM / DD / YYYY
结束日期 :04/22/2018-MM / DD / YYYY
结果1:事件B > 07到28
结果2:事件B > 01至31
结果3:事件B > 01至22
最有效的方法是什么?
在Oracle 12ccross apply上可以使用的子句:
cross apply
create table e_vents( name varchar2(10), startdate date, enddate date ); insert all into e_vents values( 'A', date '2017-12-15', date '2018-01-17' ) into e_vents values( 'B', date '2017-12-15', date '2017-12-22' ) into e_vents values( 'C', date '2017-12-15', date '2018-05-22' ) select null from dual; commit;
select e.name, case when e.startdate > x.s_date then e.startdate else x.s_date end as start_date, case when e.enddate < x.e_date then e.enddate else x.e_date end as end_date from e_vents e cross apply ( select trunc( e.startdate, 'mm') + (level-1) * interval '1' month as s_date, trunc( e.startdate + (level) * interval '1' month, 'mm') -1 as e_date from dual connect by level <= months_between( trunc( e.enddate, 'mm'),trunc( e.startdate, 'mm')) + 1 ) x
NAME START_DATE END_DATE ---------- ---------- ---------- A 2017-12-15 2017-12-31 A 2018-01-01 2018-01-17 B 2017-12-15 2017-12-22 C 2017-12-15 2017-12-31 C 2018-01-01 2018-01-31 C 2018-02-01 2018-02-28 C 2018-03-01 2018-03-31 C 2018-04-01 2018-04-30 C 2018-05-01 2018-05-22 9 rows selected.