學習筆記-----一時間函式
一時間函式[@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
(
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- js純函式學習筆記(一)JS函式筆記
- async函式學習筆記。函式筆記
- 生成函式 學習筆記函式筆記
- Golang學習筆記-1.6 函式Golang筆記函式
- JavaScript學習筆記 - 原生函式JavaScript筆記函式
- MYSQL學習筆記14: 函式MySql筆記函式
- python學習筆記(六)——函式Python筆記函式
- TS學習筆記(四):函式筆記函式
- Oracle學習筆記(6)——函式Oracle筆記函式
- 深度學習——loss函式的學習筆記深度學習函式筆記
- MYSQL學習筆記7: 聚合函式MySql筆記函式
- C++學習筆記(二)——函式C++筆記函式
- OpenCV學習筆記(4)——mixChannels函式OpenCV筆記函式
- OpenCV學習筆記(5)——normalize函式OpenCV筆記ORM函式
- Flutter學習筆記(4)--Dart函式Flutter筆記Dart函式
- c語言學習筆記===函式C語言筆記函式
- javascript學習筆記--函式的返回值可以是一個函式JavaScript筆記函式
- main函式解析(一)——Linux-0.11 學習筆記(五)AI函式Linux筆記
- MYSQL學習筆記15: 數值函式MySql筆記函式
- PHP 第八週函式學習筆記PHP函式筆記
- 學習筆記:javascript中的Generator函式筆記JavaScript函式
- JavaScript學習筆記(七)—— 再說函式JavaScript筆記函式
- 工作學習筆記(三)to_char函式筆記函式
- pandas之常用基本函式學習筆記函式筆記
- 莫比烏斯函式 - 學習筆記函式筆記
- Manim 學習筆記(一)--常用的幾個函式和操作筆記函式
- ES6學習筆記(三)【函式,物件】筆記函式物件
- Solidity語言學習筆記————28、純函式Solid筆記函式
- Solidity語言學習筆記————26、回退函式Solid筆記函式
- Python學習筆記_函式_匯入模組Python筆記函式
- python程式設計學習筆記⑦-1函式Python程式設計筆記函式
- day10學習筆記之函式上筆記函式
- PHP 第十五週函式學習筆記PHP函式筆記
- Matlab學習筆記(1)——imshow函式的使用Matlab筆記函式
- 好程式設計師學習筆記:函式程式設計師筆記函式
- JavaScript學習筆記(二)——函式和陣列JavaScript筆記函式陣列
- hive學習筆記之七:內建函式Hive筆記函式
- 【Go】Go語言學習筆記-2-函式Go筆記函式
- Solidity語言學習筆記————27、檢視函式Solid筆記函式