zoukankan      html  css  js  c++  java
  • Oracle存储过程根据指定日期返回(N个)工作日的时间

    一直都没写过Oracle的存储过程,今天突然来了一个需求:计算指定日期的前N个工作日或者后N个工作日日期(去除周末,法定节假日无法计算),

    然后研究了一下 Oracle的时间函数和循环方法。具体实现方法如下,也没啥难的,对数据库没研究过,也不知道下面的写法效率怎么样。

    或者有没有更好的写法。o(︶︿︶)o 唉!

    create or replace procedure proc_CalculationWorkDate
    (
      plan_date in date,--登录日期
      flag in number,--1 往前日期,0往后日期
      date_number in number,--天数
      out_date out date--计算出的日期
    )
    is 
      dayOfWeek number:=0;--星期的数字
      dates number:=date_number;--往前或者往后的天数(包含工作日的)初始化给他等于天数
      i int:=0;
      j int:=0;
    begin
      if flag=1 then--计算往前日期
          while i<date_number+1 loop
            SELECT to_number(to_char(sysdate+i+j,'D')) into dayOfWeek  FROM DUAL;--返回星期代表的数值
            if dayOfWeek=1 or dayOfWeek=7 then --周六 周日
               dates:=dates+1;
               i:=i;
               j:=j+1;
            else
               i:=i+1;
            end if;
          end loop;
          select plan_date+dates into out_date from dual;
          --DBMS_OUTPUT.PUT_LINE(dates); 
      end if;
      if flag=0 then --计算往后日期
          while i<date_number+1 loop
            SELECT to_number(to_char(sysdate-i-j,'D')) into dayOfWeek  FROM DUAL;
            if dayOfWeek=1 or dayOfWeek=7 then
               dates:=dates+1;
               i:=i;
               j:=j+1;
            else
               i:=i+1;
            end if;
          end loop;
          select plan_date-dates into out_date from dual;
          --DBMS_OUTPUT.PUT_LINE(dates);
      end if;
    end;
  • 相关阅读:
    2020 CCPC Wannafly Winter Camp Day2 E阔力梯的树(树上启发式合并)
    牛客练习赛73D 离别(线段树)
    从零开始部署图书管理系统
    linux下安装nginx(编译安装)及反向代理及负载均衡
    linux下MariaDB安装
    linux下virtualenvwrapper安装
    linux下安装虚拟环境
    linux下安装django2.2
    linux下安装nginx(yum源安装)
    linux系统优化命令--day03
  • 原文地址:https://www.cnblogs.com/Murray/p/4488742.html
Copyright © 2011-2022 走看看