因为PL/SQL中没有直接可以采用的函数,所以第一选择是自己写一个
create or replace function workday
(v_day1 DATE,v_day2 DATE) --两个形参,其中v_day1的日期小于v_day2
return number
as
v_num number; --计数器
v_day_1 DATE:=v_day1;
v_day char;
begin
v_num:=0;
loop
v_day :=to_char(v_day_1,'D'); --将日期转为1~7的char型
if v_day not in ('6','7') then
v_num:=v_num+1; --计数器+1
end if;
v_day_1:=v_day_1+1; --将日期往后推一天
exit when (v_day_1 =v_day2);
end loop;
return (v_num+1); --把当日算进去的话结果需+1
end;
select workday(to_date('2011-12-1','YYYY-MM-DD'),to_date('2011-12-14','YYYY-MM-DD'))
from dual;
后来想,能不能直接用SQL语句写出来呢。自己尝试了翻未成功,后来在ITPUB上发现了一个
select sum(decode(to_char(to_date('2011-12-14','yyyy-mm-dd')+rownum-1,'D'),7,0,6,0,1)) CNT
from all_objects
where rownum <= to_date('2011-12-14','yyyy-mm-dd') - to_date('2011-12-1','yyyy-mm-dd')+1
最后,我们发现,工作日并不只是排除双休日就可以了,还包括国定假日等假期,那么就发现这个问题复杂了
对于上面的情况,最好的方法是建立一张假期表