业务场景:
取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);