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;
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;
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;
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;
代码看不懂。。不过测试了下,好像不对
木有注释,看不懂啊解释解释思路呗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;