Oracle 自定义函数

计算两个日期间工作日

create or replace function f_pd_gzr_days(v_kssj in date, v_jssj in date)
  return number is
  v_days     number := 0;
  v_days_all number := 0;
  v_days_jjr number := 0;
  v_real_kssj date  := v_kssj;
  v_real_jssj date  := v_jssj;
  v_kssj_jjr number := 0;
  v_jssj_jjr number := 0;
begin
  -- 计算两个日期之间的天数
  if v_kssj >= v_jssj then -- 如果起始时间大于结束时间,将起始时间与结束时间替换
    select v_real_kssj, v_real_jssj into v_real_jssj, v_real_kssj from dual;
  end if;
  
  begin
      
     -- 如果开始时间是节假日,开始时间改为当日24点
    select count(1) into v_kssj_jjr
      from sys_holiday
     where to_date(holiday, 'yyyy/mm/dd') = trunc(v_real_kssj);
       
     if v_kssj_jjr != 0 then
       v_real_kssj := trunc(v_real_kssj + 1);
     end if;
       
     -- 如果结束时间是节假日,结束时间改为当日零点
    select count(1) into v_jssj_jjr
      from sys_holiday
     where to_date(holiday, 'yyyy/mm/dd') = trunc(v_real_jssj);
       
     if v_jssj_jjr != 0 then
       v_real_jssj := trunc(v_real_jssj);
     end if;
       
     -- 计算两日期间相隔天数
     v_days_all := v_real_jssj - v_real_kssj;
     
    select count(1) into v_days_jjr
      from sys_holiday
     where to_date(holiday, 'yyyy-mm-dd hh24:mi:ss') >= v_real_kssj
       and to_date(holiday, 'yyyy-mm-dd hh24:mi:ss') < v_real_jssj;
         
  exception
    when others then
      v_days := 0;
  end;
  
  v_days := v_days_all - v_days_jjr;

  return v_days;
exception
  when others then
    return 0;
end f_pd_gzr_days;

计算若干工作日之后的日期

create or replace function f_get_after_day(v_kssj date, v_delay number)
return date is
v_real_kssj date  := v_kssj;
v_real_jssj date;
v_kssj_jjr number := 0;
v_jssj_jjr number := 0;
v_days_jjr number := 0;
begin

  -- 如果开始时间是节假日,开始时间改为当日24点
  select count(1) into v_kssj_jjr
    from sys_holiday
   where to_date(holiday, 'yyyy/mm/dd') = trunc(v_real_kssj);
         
   if v_kssj_jjr != 0 then
     v_real_kssj := trunc(v_real_kssj + 1);
   end if;
   
  v_real_jssj := v_real_kssj + v_delay;
   
    
  -- 如果结束时间是节假日,结束时间改为次日
  select count(1) into v_jssj_jjr
    from sys_holiday
   where to_date(holiday, 'yyyy/mm/dd') = trunc(v_real_jssj);
           
   if v_jssj_jjr != 0 then
     v_real_jssj := v_real_jssj + 1;
     -- 计算两日期之间节假日的天数, 减去结束日期
    select count(1) - 1 into v_days_jjr from sys_holiday
    where to_date(holiday, 'yyyy-mm-dd hh24:mi:ss') >= v_real_kssj
      and to_date(holiday, 'yyyy-mm-dd hh24:mi:ss') < v_real_jssj;
   else
    -- 计算两日期之间节假日的天数
    select count(1) into v_days_jjr from sys_holiday
    where to_date(holiday, 'yyyy-mm-dd hh24:mi:ss') >= v_real_kssj
      and to_date(holiday, 'yyyy-mm-dd hh24:mi:ss') < v_real_jssj;
   end if;

    
  if v_days_jjr !=0 then
    -- 迭代
    v_real_jssj := f_get_after_day(v_real_jssj,v_days_jjr);
  end if;

return v_real_jssj;
end f_get_after_day;

十进制转三十六进制

CREATE OR REPLACE FUNCTION FN_10_TO_36(V_NUM NUMBER)
RETURN VARCHAR IS RESULT VARCHAR(800);
  NUM   NUMBER;
  TMP  NUMBER;
  TEMP  NUMBER;
BEGIN
NUM := V_NUM;
TMP := TRUNC(NUM / 36);
   WHILE NUM > 0 LOOP
    TEMP := MOD(NUM, 36);
    IF TEMP < 10 THEN
      RESULT := TEMP || RESULT;
    ELSE
      RESULT := CHR(TEMP + 55) || RESULT;
    END IF;
    NUM := TMP;
    TMP := TRUNC(NUM / 36);
  END LOOP;
  IF V_NUM <= 0 THEN
     return V_NUM;
     END IF;
return RESULT;
end;

获取拼音码

CREATE OR REPLACE FUNCTION F_TRANS_PINYIN_CAPITAL(P_NAME IN VARCHAR2)
  RETURN VARCHAR2 AS
  V_COMPARE VARCHAR2(100);
  V_RETURN  VARCHAR2(4000);

  FUNCTION F_NLSSORT(P_WORD IN VARCHAR2) RETURN VARCHAR2 AS
  BEGIN
    RETURN NLSSORT(P_WORD, 'NLS_SORT=SCHINESE_PINYIN_M');
  END;
BEGIN
  FOR I IN 1 .. LENGTH(P_NAME) LOOP
    V_COMPARE := F_NLSSORT(SUBSTR(P_NAME, I, 1));
    IF V_COMPARE >= F_NLSSORT('吖') AND V_COMPARE <= F_NLSSORT('驁') THEN
      V_RETURN := V_RETURN || 'a';
    ELSIF V_COMPARE >= F_NLSSORT('八') AND V_COMPARE <= F_NLSSORT('簿') THEN
      V_RETURN := V_RETURN || 'b';
    ELSIF V_COMPARE >= F_NLSSORT('嚓') AND V_COMPARE <= F_NLSSORT('錯') THEN
      V_RETURN := V_RETURN || 'c';
    ELSIF V_COMPARE >= F_NLSSORT('咑') AND V_COMPARE <= F_NLSSORT('鵽') THEN
      V_RETURN := V_RETURN || 'd';
    ELSIF V_COMPARE >= F_NLSSORT('妸') AND V_COMPARE <= F_NLSSORT('樲') THEN
      V_RETURN := V_RETURN || 'e';
    ELSIF V_COMPARE >= F_NLSSORT('发') AND V_COMPARE <= F_NLSSORT('猤') THEN
      V_RETURN := V_RETURN || 'f';
    ELSIF V_COMPARE >= F_NLSSORT('旮') AND V_COMPARE <= F_NLSSORT('腂') THEN
      V_RETURN := V_RETURN || 'g';
    ELSIF V_COMPARE >= F_NLSSORT('妎') AND V_COMPARE <= F_NLSSORT('夻') THEN
      V_RETURN := V_RETURN || 'h';
    ELSIF V_COMPARE >= F_NLSSORT('丌') AND V_COMPARE <= F_NLSSORT('攈') THEN
      V_RETURN := V_RETURN || 'j';
    ELSIF V_COMPARE >= F_NLSSORT('咔') AND V_COMPARE <= F_NLSSORT('穒') THEN
      V_RETURN := V_RETURN || 'k';
    ELSIF V_COMPARE >= F_NLSSORT('垃') AND V_COMPARE <= F_NLSSORT('擽') THEN
      V_RETURN := V_RETURN || 'l';
    ELSIF V_COMPARE >= F_NLSSORT('嘸') AND V_COMPARE <= F_NLSSORT('椧') THEN
      V_RETURN := V_RETURN || 'm';
    ELSIF V_COMPARE >= F_NLSSORT('拏') AND V_COMPARE <= F_NLSSORT('瘧') THEN
      V_RETURN := V_RETURN || 'n';
    ELSIF V_COMPARE >= F_NLSSORT('筽') AND V_COMPARE <= F_NLSSORT('漚') THEN
      V_RETURN := V_RETURN || 'o';
    ELSIF V_COMPARE >= F_NLSSORT('妑') AND V_COMPARE <= F_NLSSORT('曝') THEN
      V_RETURN := V_RETURN || 'p';
    ELSIF V_COMPARE >= F_NLSSORT('七') AND V_COMPARE <= F_NLSSORT('裠') THEN
      V_RETURN := V_RETURN || 'q';
    ELSIF V_COMPARE >= F_NLSSORT('亽') AND V_COMPARE <= F_NLSSORT('鶸') THEN
      V_RETURN := V_RETURN || 'r';
    ELSIF V_COMPARE >= F_NLSSORT('仨') AND V_COMPARE <= F_NLSSORT('蜶') THEN
      V_RETURN := V_RETURN || 's';
    ELSIF V_COMPARE >= F_NLSSORT('侤') AND V_COMPARE <= F_NLSSORT('籜') THEN
      V_RETURN := V_RETURN || 't';
    ELSIF V_COMPARE >= F_NLSSORT('屲') AND V_COMPARE <= F_NLSSORT('鶩') THEN
      V_RETURN := V_RETURN || 'w';
    ELSIF V_COMPARE >= F_NLSSORT('夕') AND V_COMPARE <= F_NLSSORT('鑂') THEN
      V_RETURN := V_RETURN || 'x';
    ELSIF V_COMPARE >= F_NLSSORT('丫') AND V_COMPARE <= F_NLSSORT('韻') THEN
      V_RETURN := V_RETURN || 'y';
    ELSIF V_COMPARE >= F_NLSSORT('帀') AND V_COMPARE <= F_NLSSORT('咗') THEN
      V_RETURN := V_RETURN || 'z';
    ELSE V_RETURN := V_RETURN || SUBSTR(P_NAME, I, 1);
    END IF;
  END LOOP;
  RETURN UPPER(V_RETURN);
END;

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!