我需要获取表getAction()
中每个getActions()
的{{1}}到DATE_FROM
之间的所有日期,但不包括周末,工作暂停和假期。考虑此记录(DATE_TO
,ID
,LEAVE
):
ID
我需要以这种格式(DATE_FROM
,DATE_TO
)获取这些范围之间的所有日期:
001 04-OCT-2018 09-OCT-2018
002 05-OCT-2018 05-OCT-2018
...
n 01-OCT-2018 05-OCT-2018
我正在使用根据我发现的查询修改的查询:
ID
问题在于,除非DAY_TOKEN
和001 04-OCT-2018
001 05-OCT-2018
001 08-OCT-2018
001 09-OCT-2018
002 05-OCT-2018
...
n 01-OCT-2018
n 02-OCT-2018
n 03-OCT-2018
n 04-OCT-2018
n 05-OCT-2018
的日期相同,否则只有第一条记录会正确扩展,而其他记录将不会包含在记录集中。
我想尽可能避免使用PL-SQL函数,但是如果不使用函数就无法获得所需的结果集,请至少告诉我原因。
答案 0 :(得分:2)
在这里,如何为每个ID创建的行数要介于FROM和TO之间的天数,而不需要周末(周六和周日):
SQL> with leave (id, date_from, date_to) as
2 (select '001', date '2018-10-04', date '2018-10-09' from dual union all
3 select '002', date '2018-10-05', date '2018-10-05' from dual union all
4 select '003', date '2018-10-02', date '2018-10-08' from dual
5 ),
6 inter as
7 (select l.id,
8 l.date_from + column_value datum,
9 to_char(l.date_from + column_value, 'day') day
10 from leave l,
11 table(cast(multiset(select level from dual
12 connect by level <= l.date_to - l.date_from + 1
13 ) as sys.odcinumberlist))
14 )
15 select id, datum
16 from inter
17 where to_char(datum, 'dy') not in ('sat', 'sun');
ID DATUM
--- -----------
001 05-oct-2018
001 08-oct-2018
001 09-oct-2018
001 10-oct-2018
003 03-oct-2018
003 04-oct-2018
003 05-oct-2018
003 08-oct-2018
003 09-oct-2018
9 rows selected.
SQL>
在第18行(依此类推)中,添加其他条件(删除假期,停赛等)。
(顺便说一句,我想知道是谁和为什么否决了您的问题;它的格式正确,显示了您的问题,您为解决这个问题而做的尝试……确实,对我来说是个谜)。