Oracle使用包计算两个日期相差的工作日

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值