create table table_test (my_date date); ----------------------------------------------------------------create or replace procedure pro_test ( begin_date in varchar2, end_date in varchar2 ) as i number(4); j number(4); begin if to_date(begin_date,'yyyymmdd')>to_date(end_date,'yyyymmdd') then RAISE_APPLICATION_ERROR(-20007,'你輸入的起始日期大於結束日期!!!'); end if; i:=to_date(end_date,'yyyymmdd')-to_date(begin_date,'yyyymmdd'); for j in 0..i loop insert into table_test (my_date) values( to_date(begin_date,'yyyymmdd')+j); end loop; commit; delete from table_test a where a.my_date in ( select distinct WORK_DATE from your_table ); commit; end; ------------------------------------------------------sql>exec pro_test('20040104','20040115');sql>select * from table_test;
非常感谢baojianjun(包子)给出了一个解决问题的办法. 但是不让创建临时表.再次感谢.
create procedure pro(p_start in date,p_end in date) as cursor t_sor is select WORK_DATE from tabname group by work_date order by work_date; type t_varr is varray(100) of date; v_varr t_varr; num number:=1; begin for v_sor in t_sor loop if v_sor.work_date>=p_end then return; enf if; /*开始日期与结束日期在范围内*/ if v_sor.work_date>p_start and v_sor.work_date<p_end then if v_sor.work_date=p_start or v_sor.work_date=p_end then exit; end if; v_varry.extexd; v_varr(num):=v_sor.work_date; end if; /*开始日期在少于min(work_date),结束日期在范围内*/ /*开始日期在范围内,结束日期大于max(work_dae)*/ /*结束日期少于min(work_date)*/ /*开始日期大于max(work_date)*/ num:=num+1; end loop; end; / 以上分别对以上条件作一个处理
假设原表表名为work 这一个足够大(足够多的记录数)的表,比如test 然后: select start_date + rownum - 1 from test where rownum <= end_date - start_date minus select word_date from word;如果相差一两条记录或者相差一两天,自己可以修改补上。
在一个表中有一个WORK_DATE字段我要求出的是
比如数据是
20040101
20040102
20040103
我给出日期20040101,20040115.
要得到的是
20040104
::::::::
20040115
怎么取非常感谢.
再次请教高手.
(my_date date);
----------------------------------------------------------------create or replace procedure pro_test
(
begin_date in varchar2,
end_date in varchar2
)
as
i number(4);
j number(4);
begin
if to_date(begin_date,'yyyymmdd')>to_date(end_date,'yyyymmdd') then
RAISE_APPLICATION_ERROR(-20007,'你輸入的起始日期大於結束日期!!!');
end if;
i:=to_date(end_date,'yyyymmdd')-to_date(begin_date,'yyyymmdd');
for j in 0..i loop
insert into table_test
(my_date)
values( to_date(begin_date,'yyyymmdd')+j);
end loop; commit; delete from table_test a
where a.my_date in
(
select distinct WORK_DATE
from your_table
); commit;
end;
------------------------------------------------------sql>exec pro_test('20040104','20040115');sql>select * from table_test;
但是不让创建临时表.再次感谢.
as
cursor t_sor is
select WORK_DATE from tabname group by work_date order by work_date;
type t_varr is varray(100) of date;
v_varr t_varr;
num number:=1;
begin
for v_sor in t_sor loop
if v_sor.work_date>=p_end then
return;
enf if;
/*开始日期与结束日期在范围内*/
if v_sor.work_date>p_start and v_sor.work_date<p_end then
if v_sor.work_date=p_start or v_sor.work_date=p_end then
exit;
end if;
v_varry.extexd;
v_varr(num):=v_sor.work_date;
end if;
/*开始日期在少于min(work_date),结束日期在范围内*/
/*开始日期在范围内,结束日期大于max(work_dae)*/
/*结束日期少于min(work_date)*/
/*开始日期大于max(work_date)*/
num:=num+1;
end loop;
end;
/
以上分别对以上条件作一个处理
这一个足够大(足够多的记录数)的表,比如test
然后:
select start_date + rownum - 1 from test
where rownum <= end_date - start_date
minus
select word_date from word;如果相差一两条记录或者相差一两天,自己可以修改补上。
但是我还是想找更好的办法.
谁有更好的解决方法啊?在此对回复的人表示谢谢.
hc_yao(木头) 的方法不错,先把所有枚举日期都建在一个test表中,随时使用。要不然很难办。
还有每一个答复的人.