扩展日期范围以从具有排除日期的表中获取日期范围系列之间的所有日期

时间:2018-10-15 12:15:03

标签: sql oracle oracle11g

我需要获取表getAction()中每个getActions()的{​​{1}}到DATE_FROM之间的所有日期,但不包括周末,工作暂停和假期。考虑此记录(DATE_TOIDLEAVE):

ID

我需要以这种格式(DATE_FROMDATE_TO)获取这些范围之间的所有日期:

001   04-OCT-2018   09-OCT-2018
002   05-OCT-2018   05-OCT-2018
...
n     01-OCT-2018   05-OCT-2018

我正在使用根据我发现的查询修改的查询:

ID

问题在于,除非DAY_TOKEN001 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函数,但是如果不使用函数就无法获得所需的结果集,请至少告诉我原因。

1 个答案:

答案 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行(依此类推)中,添加其他条件(删除假期,停赛等)。

(顺便说一句,我想知道是谁和为什么否决了您的问题;它的格式正确,显示了您的问题,您为解决这个问题而做的尝试……确实,对我来说是个谜)。