Oracle使用包计算两个日期相差的工作日
1. 前言
做项目时客户提出一个需求,要求计算报价及时率,在询价发布之后的4个工作日,如果供应商没有报价,则报价及时率是0%,否则就是100%。
2. 实现
首先设计包主体
FUNCTION get_workdayFun(start_dt in DATE,end_dt in DATE ) return VARCHAR is
v_result VARCHAR2(20) := 0;
BEGIN
SELECT (TRUNC(end_dt - start_dt) - ((CASE
WHEN (8 - to_number(to_char(start_dt, 'D'))) >
TRUNC(end_dt - start_dt) + 1 THEN
0
ELSE
trunc((TRUNC(end_dt - start_dt) -
(8 - to_number(to_char(start_dt, 'D')))) / 7) + 1
END) + (CASE
WHEN MOD(8 - to_char(start_dt, 'D'), 7) >
TRUNC(end_dt - start_dt) - 1 THEN
0
ELSE
TRUNC((TRUNC(end_dt - start_dt) -
(MOD(8 - to_char(start_dt, 'D'), 7) + 1)) / 7) + 1
END)))
INTO v_result
FROM dual;
RETURN v_result;
END;
然后设置包规格,使之可以使用
FUNCTION get_workdayFun(start_dt in DATE,end_dt in DATE) return VARCHAR;
3. 扩展
如何设计一个包,示例语法如下。
function functionName(param1 in varchar2, --参数1
param2 in varchar2 --参数2
) return number is
v_result number := 0;
v_result1 number;
v_result2 number;
v_result3 number;
cursor cur_order is--定义一个指针
select nvl(oi.fbk1, 0),
nvl(oi.fbk2, 0),
nvl(oir.fbk3, 0)
from order_item oi, order_item_receive oir
where oi.ordernumber = oir.ordernumber(+)
and oi.orderitemnumber = oir.orderitemnumber(+)
and oi.ordernumber = param1
and oi.orderitemnumber = param2;
begin
open cur_order;--读取指针
fetch cur_order
into v_result1, v_result2, v_result3;
close cur_order;--关闭指针
v_result := v_result1+v_result2+v_result3;
return nvl(v_result, 0);
exception
when others then
return nvl(v_result, 0);
end;