oracle查找当前日期的三个工作日前那天日期,采用函数方式

业务场景:

取A表中的字段“日期1”的三个工作日前的那一天。有一张现成的表里面是有每年的节假日和周末的期间。

 具体表如下:

查询表ZS_YJSF 时,加条件:YZRQ(应征日期)字段等于当前日期的三个工作日前的那天。

有一张表CS_JJR中有两个字段:节假日期起JJRQQ,节假日期止JJRQZ,存了每年所有的节假日周末日期区间。

模拟场景:

CREATE OR REPLACE FUNCTION Func_getworkday(
v_date DATE, -- 指定某日期
v_deferday NUMBER -- 前几天日期
) RETURN DATE
IS 
v_beforeday DATE :=v_date-v_deferday+1;
v_holiday_num NUMBER :=0;
v_sum  NUMBER:=0;
i NUMBER :=1;
v_bd NUMBER :=v_deferday;
v_date1 DATE:= to_date(to_char(v_date,'yyyymmdd'),'yyyymmdd');
v_sql VARCHAR2(1000);
BEGIN 
  WHILE i<=(v_bd+v_sum) LOOP
    -- 遍历日期,如在节假日表中找到数据则记为1,否则记为0,保存在变量v_holiday_num中
    v_sql:='SELECT nvl(count(1),0)  FROM CS_JJR  WHERE :1 BETWEEN to_date(to_char(JJROO,''yyyymmdd''),''yyyymmdd'')
           AND to_date(to_char(JJRQZ,''yyyymmdd''),''yyyymmdd'')';
    EXECUTE IMMEDIATE v_sql INTO  v_holiday_num USING v_date1;
    -- 累计假期天数总和
    v_sum:=v_sum+v_holiday_num;
    v_date1:=v_date1-1;
    i:=i+1;
  END LOOP; 
   v_beforeday:=v_beforeday-v_sum;
RETURN to_date(to_char(v_beforeday,'yyyymmdd'),'yyyymmdd');
END;

SELECT * FROM ZS_YJSF 
WHERE to_date(to_char(YZRQ,'yyyymmdd'),'yyyymmdd')=Func_getworkday(sysdate,3);


 

++a
发布了13 篇原创文章 · 获赞 0 · 访问量 1099

猜你喜欢

转载自blog.csdn.net/qq_40881607/article/details/104930726