我有句号= 3day /周/月,start_date和end_date。当我为例如选择start_date时。 12-DEC-2013 ..然后我想验证end_date是在start_date + period(3day)+ 2day(默认)...所以end_date将是16-DEC-2013 ..我在这里写了代码..
declare
v_period date;
begin
if :P104_TYPE_PERIOD = 'DAY' then
v_period := ((TO_DATE(:P104_START_DATE, 'DD-MON-YYYY')+(nvl(to_number(replace(:P104_COURSE_PERIOD,',', '0'))),0)))+2);
end if;
if :P104_TYPE_PERIOD = 'WEEK' then
v_period := ((TO_DATE(:P104_START_DATE, 'DD-MON-YYYY')+(nvl(to_char(to_number(replace(:P104_COURSE_PERIOD,',', '0'))),0)*7))+2);
end if;
if :P104_TYPE_PERIOD = 'MONTH' then
v_period := ((TO_DATE(:P104_START_DATE, 'DD-MON-YYYY')+(nvl(to_char(to_number(replace(:P104_COURSE_PERIOD,',', '0'))),0)*30))+2);
end if;
if v_period < :P104_END_DATE then
return false;
end if;
end;
运行页面后,会显示以下消息:
Error processing validation.
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
有谁知道如何解决这个问题? 提前谢谢!
答案 0 :(得分:0)
假设:P104_COURSE_PERIOD
是NUMBER
;
您的广告正在用0替换逗号,如果不 a NUMBER
,您是否可以提供可能的值。
declare
v_period date;
v_date_offset_factor NUMBER;
begin
if :P104_TYPE_PERIOD = 'DAY' then
v_date_offset_factor := 1;
ELSIF :P104_TYPE_PERIOD = 'WEEK' then
v_date_offset_factor := 7;
ELSIF :P104_TYPE_PERIOD = 'MONTH' then
v_date_offset_factor := 30;
END IF;
v_period := TO_DATE(:P104_START_DATE, 'DD-MON-YYYY') + (:P104_COURSE_PERIOD * v_date_offset_factor ) + 2;
if v_period < TO_DATE(:P104_END_DATE,'DD-MON-YYYY') then
return false; -- Do you return something?
end if;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line( SQLERRM||chr(10)||dbms_utility.format_error_backtrace );
end;
请尝试以上PL / SQL
需要注意: 你将日期乘以30,我猜你做了一个月的计算,但也有28个月和31天的月份。你有没有考虑过他们?