Oracle 使用level迭代工作日

Oracle 使用level迭代工作日,oracle,plsql,Oracle,Plsql,我正在检查接下来的30天,不包括周末和假期。所以,从现在开始,每个工作日,我都必须24小时返回。我正在使用下面的查询,但我不知道究竟什么是CONNECTBY子句 select TO_char(t1.a_dt + ((level-1)/24),'dd/mm/yyyy hh24:mi:ss') data_formatada, level levl from ( SELECT sysdate + LEVEL - 1 AS a_dt FROM

我正在检查接下来的30天,不包括周末和假期。所以,从现在开始,每个工作日,我都必须24小时返回。我正在使用下面的查询,但我不知道究竟什么是CONNECTBY子句

select TO_char(t1.a_dt + ((level-1)/24),'dd/mm/yyyy hh24:mi:ss') data_formatada,
       level levl
from (              
    SELECT  sysdate + LEVEL - 1 AS a_dt
    FROM    dual
    where   TO_CHAR (sysdate + LEVEL - 1, 'Dy' , 'NLS_DATE_LANGUAGE = ''ENGLISH''' )
                          NOT IN ('Sat', 'Sun')
    CONNECT BY LEVEL <= 1 + TRUNC (sysdate + 30) - TRUNC (sysdate)
    MINUS
    select  HOLIDAY_DAY 
    from    HOLIDAYS ) t1
    connect by level <= 24 (??)
);
我期待着这样的结果:

select     to_char(sysdate + (level - 1) / 24) as data_formatada
from       dual
where      to_char(sysdate + (level - 1) / 24, 'Dy', 'nls_date_language = English') 
              not in ('Sat', 'Sun')
  and      trunc(sysdate + (level - 1) / 24) not in ( select holiday_day from holidays )
connect by level <= 720
;

也许会是这样

select TO_char(t1.a_dt + ((lvl- 1) / 24), 'dd/mm/yyyy hh24:mi:ss') data_formatada,
       lvl
  from (SELECT sysdate + LEVEL - 1 AS a_dt, level as lvl
          FROM dual
         where TO_CHAR(sysdate + LEVEL - 1,
                       'Dy',
                       'NLS_DATE_LANGUAGE = ''ENGLISH''') NOT IN
               ('Sat', 'Sun')
        CONNECT BY LEVEL <= 1 + TRUNC(sysdate + 30) - TRUNC(sysdate)
        MINUS
        select HOLIDAY_DAY, null lvl
          from HOLIDAYS) t1

如果我在你帖子下面的评论中的猜测是正确的,那么一个非常简单但有点低效的方法是这样的:

select     to_char(sysdate + (level - 1) / 24) as data_formatada
from       dual
where      to_char(sysdate + (level - 1) / 24, 'Dy', 'nls_date_language = English') 
              not in ('Sat', 'Sun')
  and      trunc(sysdate + (level - 1) / 24) not in ( select holiday_day from holidays )
connect by level <= 720
;

你好不幸的是,不起作用:ORA-01788:CONNECT BY子句在此查询块中是必需的。我已编辑了答案,忘记将级别更改为lvlIt。不清楚您需要什么。从现在开始,生成720行,间隔一小时,持续30天*24小时,然后忽略不包括日期部分为周末或假日的行?您好。谢谢!我删除了返回假日的子查询,因为以下异常:ORA-32037:不支持在成员资格条件中使用级别,因此,我重写了查询,使用减号:select TO_chart.data_hora,'dd/mm/yyyy hh24:mi:ss'dte,rownum levl from select SYSDATE+NUMTODSINTERVALLEVEL-1,“小时”作为双数据源的时间,其中TRUNCSYSDATE+NUMTODSINTERVALLEVEL-1,“小时”-TRUNCSYSDATE+NUMTODSINTERVALLEVEL-1,“小时”,“IW”<5按级别连接