CREATE OR REPLACE FUNCTION TEST(PI_S_DT DATE, PI_E_DT DATE) RETURN VARCHAR2 IS
  I    INTEGER := 1;
  S_DT DATE;
BEGIN  BEGIN
    S_DT := PI_S_DT;
    WHILE (I < 4) LOOP
      IF TRIM(TO_CHAR(S_DT, 'Day')) IN ('Saturday', 'Sunday') OR
         TO_CHAR(S_DT, 'mmdd') IN ('0101', '0501', '1001', '1002', '1003') THEN
        NULL;
      ELSE
        I := I + 1;
      END IF;
      S_DT := S_DT + 1;
    END LOOP;
    IF S_DT < PI_E_DT THEN
      RETURN('no');
    ELSE
      RETURN('yes');
    END IF;
  
  END;END TEST;

解决方案 »

  1.   

    create or replace function ff_isdafu(in_start in date, in_end in date)
      return varchar2 is
      v_ret   varchar2(10) := '二者相等';
      v_start date;
      v_end   date;
      i       number := 1;
      v_flag  number := 0;
    begin  loop
        if v_flag < 3 then 
          v_start := in_start + i;   
          if to_char(v_start, 'd') not in ('1', '7') and
             to_char(v_start, 'mmdd') not in ('0101', '0501', '1001', '1002', '1003') then
            v_end  := v_start;
            v_flag := v_flag + 1;
          end if;
        else
          exit;
        end if;
        i := i + 1;
      end loop;
      if v_end > in_end then
        v_ret := 'YES';
      elsif v_end < in_end then
        v_ret := 'NO';
      end if;
      return v_ret;
    end;
      

  2.   

    CREATE OR REPLACE FUNCTION TEST(PI_S_DT DATE, PI_E_DT DATE) RETURN VARCHAR2 IS
      I    INTEGER := 1;
      S_DT DATE;
    BEGIN  BEGIN
        S_DT := PI_S_DT;
        WHILE (I < 4) LOOP
          IF TRIM(TO_CHAR(S_DT, 'Day')) IN ('Saturday', 'Sunday') OR
             TO_CHAR(S_DT, 'mmdd') IN ('0101', '0501', '1001', '1002', '1003') THEN
            NULL;
          ELSE
            I := I + 1;
          END IF;
          S_DT := S_DT + 1;
        END LOOP;
        IF S_DT < PI_E_DT THEN
          RETURN('no');
        ELSE
          RETURN('yes');
        END IF;
      
      END;END TEST;
    代码看不懂。。不过测试了下,好像不对
      

  3.   


    木有注释,看不懂啊解释解释思路呗create or replace function ff_isdafu(in_start in date, --开始时间
                                          in_end in date--答复时间
                                          )
      return varchar2 is
      v_ret   varchar2(10) := '二者相等';
      v_start date;
      v_end   date;--实际1-3天之后的日期
      i       number := 1;
      v_flag  number := 0;
    begin
      loop
        if v_flag < 3 then--v_flag相当于实际要加的天数,i只是一个循环标记 (总共加的天数)
          v_start := in_start + i;--开始时间 +i天之后的新日期
          if to_char(v_start, 'd') not in ('1', '7') and--to_char转换 是否是周末('1':周日,'7':周六)
             to_char(v_start, 'mmdd') not in
             ('0101', '0501', '1001', '1002', '1003') then
            v_end  := v_start;
            v_flag := v_flag + 1;--如果 新日期 v_start 不是节假日,那么v_flag就 +1,并且把这个新日期赋值个v_end ,用以和答复日期作比较
          end if;
        else --如果实际加的天数>=3了,就跳出循环 ,(因为v_flag初始值为 0)
          exit;
        end if;
        i := i + 1;
      end loop;
      if v_end > in_end then--这里就不用解释了吧,你题目中只说了>,<的情况, 所以我 =的时候,就是初始值了
        v_ret := 'YES';
      elsif v_end < in_end then
        v_ret := 'NO';
      end if;
      return v_ret;
    end;