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;
解决方案 »
- 求个SQL语句
- oracle 转换到SQL Server
- Oracle 数据库峰值统计的Sql怎么写
- 第一次写oracle存储过程,大家帮忙看看语法有什么问题。
- 关于Oracle9i多个实例的启动与关闭
- 我们要实现一个统计功能,这个SQL语句不知道怎么写啊(在线等待)
- 求问用在BCB或DEPHI那种方法把标准文本文件导入数据库效率最高
- 請教一下各位大俠怎樣編譯Pro*C和源文件.pc,?
- 为何在red hat 7.2上装不上 oracle8.1.7
- 返回今天是星期幾--(若當天是星期五,則1.1返回星期五--1.2返回 Friday) 大哥们必须得用orcale
- oracle,Where in 怎么绑定变量?
- 请教一个复杂的SQL语句
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;