Sql 计算表中每行两个日期之间的工作日

Sql 计算表中每行两个日期之间的工作日,sql,oracle,Sql,Oracle,我试图实现计算表中两个日期字段之间的工作日 select count(*) from ( select rownum rnum from all_objects where rownum <= to_date('&1') - to_date('&2')+1 ) where to_char( to_date('&2')+rnum-1, 'DY' ) not in ( 'SAT', 'SUN' ) 我不知道如何

我试图实现计算表中两个日期字段之间的工作日

 select count(*)
   from ( select rownum rnum
            from all_objects
           where rownum <= to_date('&1') - to_date('&2')+1 )
  where to_char( to_date('&2')+rnum-1, 'DY' ) not in ( 'SAT', 'SUN' )
我不知道如何将值传递给toms代码,也不知道如何进行变通,以便每次执行select时都使用不同的日期集,从而获得类似的输出:

罗维德|生意|天


我想这可以通过PL/SQL块来实现,但如果可能的话,我更愿意将其保留为一个查询。是否可以使用toms one上方的select中的&1参数传递值?

这是另一种日历表很方便的情况。日历表的每个日期都有一行

如果周六和周日不是工作日,那么假期也很可能不是。日历表中用于指示假日的字段使得从工作日计算中排除假日变得更加容易

试试这个:

SELECT COUNT(*)
   FROM ( SELECT ROWNUM rnum
            FROM all_objects
           WHERE ROWNUM <= TO_DATE('2014-02-07','yyyy-mm-dd') - TO_DATE('2014-02-01','yyyy-mm-dd')+1 )
  WHERE TO_CHAR( TO_DATE('2014-02-01','yyyy-mm-dd')+rnum-1, 'DY' ) NOT IN ( 'SAT', 'SUN' )

这与原始askTom不同,但如果您使用的是11gR2,则可以使用递归CTE:

with rcte(a,b, i, is_wd) as (
select from_dt , to_dt , id, case when (to_char(from_dt, 'DY') in ('SAT','SUN')) then 0 else 1 end from t
  union all
  select decode(a, null, a,a+1), b, i, case when (to_char(a, 'DY') in ('SAT','SUN')) then 0 else 1 end 
  from rcte
  where a+1 <= b
)
select i id, sum(is_wd) 
from rcte
group by i
其中t是一个包含起始日期和截止日期的表


你打算怎么做?这两个日期从何而来?我想将其作为一个简单的查询运行,并且这两个日期是表中的列。我想计算该表中某些行的营业日。我们的数据模型中已经有一个日历表,但它只记录银行假日,不包括周六和周日。如果您有日历表,为什么不使用它来解决此问题?
with rcte(a,b, i, is_wd) as (
select from_dt , to_dt , id, case when (to_char(from_dt, 'DY') in ('SAT','SUN')) then 0 else 1 end from t
  union all
  select decode(a, null, a,a+1), b, i, case when (to_char(a, 'DY') in ('SAT','SUN')) then 0 else 1 end 
  from rcte
  where a+1 <= b
)
select i id, sum(is_wd) 
from rcte
group by i