创建函数:
CREATE OR REPLACE FUNCTION fun_get_workdays
--功能:取两个日期之间的工作日期数,即除去周六日的天数
--编码,设计:Alvin Zhang
--日期:2014.4.3
(
iod IN DATE, --输入日期1
ind IN DATE --输入日期2
)
RETURN NUMBER --返回工作天数
AS
vod DATE; --日期变量
vnd DATE; --日期变量
vn NUMBER; --数字变量
BEGIN
--输入的两个日期大小判断并赋值
IF ind>=iod THEN
vnd:=ind;
vod:=iod;
ELSE
vnd:=iod;
vod:=ind;
END IF;
--取两个日期间的工作天数
SELECT COUNT(*) INTO vn
FROM (SELECT vod + ROWNUM - 1 RN
FROM DUAL
CONNECT BY ROWNUM <= vnd - vod)
WHERE TO_CHAR(RN, 'D') BETWEEN 2 AND 6;
--返回数字
RETURN vn;
--异常判断并返回-1
EXCEPTION
WHEN OTHERS THEN
RETURN -1;
END fun_get_workdays;
查询:select id, fun_get_wordday(bgindate, enddate) from table;
实例:因日期字段为varchar2 所以函数传参时需转为日期类型 (ps: 返回的工作日不包含begindate当天)
select a.pdomain1 药品,
a.pid,
a.ppin 档案号,
a.pdomain,
a.pchinesename 患者姓名,
a.pname 援助计划,
a.psname 当前状态,
a.pcreatedate 数据创建时间,
a.mrendtime 首次批准时间,
fun_get_workdays(to_date(pcreatedate, 'yyyy-MM-DD'),
to_date(mrendtime, 'yyyy-MM-DD')) 批准周期
from (select distinct p.pid,
case p.pdomain
when '1' then
p.pgpin
else
p.ppin
end ppin,
case p.pdomain
when '1' then
'格列卫'
else
'达希纳'
end pdomain1,
p.pdomain,
p.pchinesename,
n.pname,
p.pplanstatus,
d.psname,
p.pcreatedate,
m.mrendtime
from tb_patient p
left join dm_planstatus d
on p.pplanstatus = d.psid
left join dm_plan n
on p.pplan = n.pid
left join tb_mailsrecord m
on (p.pid = m.mrpatient and m.mrmailtype = 1)
where p.pcreatedate > '2013-12-31'
and p.pplanstatus > 3
and p.pstatus = 'A') a
order by a.pdomain, a.pid