oracle 取两个日期间的工作日(无周六日)

创建函数:

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


 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值