學習筆記-----一時間函式

cosio發表於2007-08-16
一時間函式[@more@]create or replace procedure test
(

date_beg in varchar2,

date_end in varchar2,

duration_type in varchar2 )

as

beg_date date;

end_date date;

beg_month date;

end_month date;
begin

if to_date(date_beg,'yyyy-mm-dd')>to_date(date_end,'yyyy-mm-dd') then

dbms_output
.put_line('beginning date must be earlier than end date');

else

beg_date := to_date(date_beg,'yyyy-mm-dd');

end_date := to_date(date_end,'yyyy-mm-dd');

if
duration_type='week' then

while beg_date+6<=end_date loop

if to_char(beg_date,'D')='2' then

while beg_date+6<=end_date loop

insert into test2 values
(to_char(beg_date,'yyyy-mm-dd'),to_char(beg_date+6,'yyyy-mm-dd'));

beg_date := beg_date+7;

end loop;

end if;

beg_date := beg_date+1;

end loop;

else

if
to_char(beg_date,'dd')='01' then

beg_month
:= beg_date;

else

beg_month := to_date(to_char(add_months(beg_date,1),'yyyy-mm')||'-01','yyyy-mm-dd');

end if;

if
to_char(end_date,'yyyy-mm-dd')=to_char(last_day(end_date),'yyyy-mm-dd') then

end_month
:= end_date;

else

end_month := to_date(to_char(last_day(add_months(end_date,-1)),'yyyy-mm-dd'),'yyyy-mm-dd');

end if;

if
duration_type='month' then

while to_char(beg_month,'yyyy-mm')<=to_char(end_month,'yyyy-mm') loop

insert into test2 values
(to_char(beg_month,'yyyy-mm-dd'),to_char(last_day(beg_month),'yyyy-mm-dd'));

beg_month := add_months(beg_month,1);

end loop;

elsif duration_type='quarter' then

while to_char(add_months(beg_month,2),'yyyy-mm')<=to_char(end_month,'yyyy-mm') loop

if to_char(beg_month,'mmdd') in ('0101','0401','0701','1001') then

while to_char(add_months(beg_month,2),'yyyy-mm')<=to_char(end_month,'yyyy-mm') loop

insert into test2 values
(to_char(beg_month,'yyyy-mm-dd'),to_char(last_day(add_months(beg_month,2)),'yyyy-mm-dd'));

beg_month := add_months(beg_month,3);

end loop;

end if;

beg_month := add_months(beg_month,1);

end loop;

elsif duration_type='semiyear' then

while to_char(add_months(beg_month,5),'yyyy-mm')<=to_char(end_month,'yyyy-mm') loop

if to_char(beg_month,'mmdd') in ('0101','0701') then

while to_char(add_months(beg_month,5),'yyyy-mm')<=to_char(end_month,'yyyy-mm') loop

insert into test2 values
(to_char(beg_month,'yyyy-mm-dd'),to_char(last_day(add_months(beg_month,5)),'yyyy-mm-dd'));

beg_month := add_months(beg_month,6);

end loop;

end if;

beg_month := add_months(beg_month,1);

end loop;

end if;

end if;

end if;

commit;



exception

when others then

dbms_output
.put_line(sqlerrm);
end;

/


SQL> exec test('2007-06-01','2009-11-30','semiyear');


PL/SQL procedure successfully completed.


SQL> SELECT * FROM TEST2;


BEG_DATE END_DATE
---------- ----------
2007-07-01 2007-12-31

2008
-01-01 2008-06-30

2008
-07-01 2008-12-31

2009
-01-01 2009-06-30

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/101162/viewspace-962627/,如需轉載,請註明出處,否則將追究法律責任。

相關文章