一,日期相關的函數
Select to_char(sysdate,'Q') from dual;--指定日期的季度
Select to_char(sysdate,'MM') from dual;--月份
Select to_char(sysdate,'WW') from dual;--當年第幾周
Select to_char(sysdate,'W') from dual ;--本月第幾周
Select to_char(sysdate,'DD') from dual;--當月第幾天
Select to_char(sysdate,'D') from dual;--周內第幾天
Select to_char(sysdate,'DY') from duaL;--星期幾
Select last_day(sysdate) from dual;--本月最后一天
Select add_months(sysdate,2) from dual;--當前日期d后推n個月
select months_between(sysdate,to_date('2012-11-12','yyyy-mm-dd'))from dual;--日期f和s間相差月數
SELECT (next_day(sysdate,1)+1) FROM dual;--指定的日期之后的第一個工作日的日期
select to_char(add_months(last_day(sysdate),-1),'yyyy-MM-dd') LastDay from dual;--上月末天
select to_char(add_months(sysdate,-1),'yyyy-MM-dd') PreToday from dual;--上月今天
select to_char(add_months(last_day(sysdate)+1,-2),'yyyy-MM-dd') firstDay from dual;--上月第一天
select to_char(sysdate,'ww') from dual group by to_char(sysdate,'ww');--按照每周進行統計
select to_char(sysdate,'mm') from dual group by to_char(sysdate,'mm');--按照每月進行統計
select to_char(sysdate,'q') from dual group by to_char(sysdate,'q');--按照每季度進行統計
二,循環
編寫循環控制結構時,用戶可以使用基本循環,WHILE循環和FOR循環等三種類型的循環語句,下面分別介紹使用這三種循環語句的方法。
1.基本循環
LOOP
statement1;
......
EXIT [WHEN condition];
END LOOP;
當使用基本循環時,無論是否滿足條件,語句至少會被執行一次,當condition為TRUE時,會退出循環,並執行END LOOP后的相應操作。當編寫基本循環時一定要包含EXIT語句,否則會陷入死循環。另外還應該定義循環控制變量,並且在循環體內修改循環控制變量的值。示例:
SQL> declare
2 i int:=1;
3 begin
4 loop
5 insert into testloop values(i);
6 exit when i=10;
7 i:=i+1;
8 end loop;
9 end;
10 /
2.WHILE循環
基本循環至少要執行一次循環體內的語句,而對於WHILE循環來說,只有條件為TRUE時,才會執行循環體內的語句。WHILE循環以WHILE ...LOOP開始,以END LOOP結束。
WHILE condition LOOP
statement1;
statement2;
.....
END LOOP;
當condition為TRUE時,執行循環體內的語句,而當condition為FALSE或NULL時,會退出循環,並執行END LOOP后的語句。當使用WHILE循環時,應該定義循環控制變量,並在循環體內改變循環控制變量的值。示例:
SQL> declare
2 i int:=1;
3 begin
4 while i<=10 loop
5 insert into testloop values(i);
6 i:=i+1;
7 end loop;
8 end;
9 /
3.FOR循環
當使用基本循環或WHILE循環時,需要定義循環控制變量,並且循環控制變量不僅可以使用NUMBER類型,也可以使用其他數據類型。當使用FOR循環時,ORACLE會隱含定義循環控制變量。
FOR counter in [REVERSE] lower_bound. .upper_bound LOOP
statement1;
statement2;
.......
END LOOP;
counter是循環控制變量,並且該變量由oracle隱含定義,不需要顯式定義。lower_bound和upper_bound分別對應於循環控制變量的下界值和上界值,默認情況下,當使用FOR循環時,每次循環時循環控制變量會自動增1.如果指定REVERSE選項,那么每次循環時循環控制變量會自動減1。示例:
SQL> begin
2 for i in reverse 1..10 loop
3 insert into testloop values(i);
4 end loop;
5 end;
三,綜合案例
建一個這樣的表
create table test_date
(
v1 varchar2(40),
v2 varchar2(40),
v3 varchar2(40),
v4 varchar2(40),
v5 varchar2(40),
v6 varchar2(40),
v7 varchar2(40),
v8 varchar2(40),
v9 varchar2(40)
);
要求寫一個存儲過程
往這個測試表中插入數據
從2007年1月1日到2008年1月17日
循環插入
V1 |
V2 |
V2 |
V4(季度) |
V5(一年中的第幾周) |
V6(星期幾) |
V7(是否周六日) |
V8(上一月) |
V9(本月最后一天) |
2007年01月01日 |
200701 |
01 |
1 |
1 |
1 |
0 |
200612 |
20070131 |
2007年01月02日 |
200701 |
01 |
1 |
1 |
2 |
0 |
200612 |
20070131 |
2007年01月03日 |
200701 |
01 |
1 |
1 |
3 |
0 |
200612 |
20070131 |
2007年01月04日 |
200701 |
01 |
1 |
1 |
4 |
0 |
200612 |
20070131 |
2007年01月05日 |
200701 |
01 |
1 |
1 |
5 |
0 |
200612 |
20070131 |
2007年01月06日 |
200701 |
01 |
1 |
1 |
6 |
1 |
200612 |
20070131 |
2007年01月07日 |
200701 |
01 |
1 |
1 |
7 |
1 |
200612 |
20070131 |
2007年01月08日 |
200701 |
01 |
1 |
2 |
1 |
0 |
200612 |
20070131 |
最終sql代碼
1 declare 2 i int := 1; 3 begin 4 while i <= SELECT TRUNC(TO_DATE( '2008-01-17', 'yyyy-MM-dd')-TO_DATE( '2007-01-01', 'yyyy-MM-dd')) FROM DUAL 5 loop 6 insert into est_date 7 (v1,v2,v3,v4,v5,v6,v7,v8,v9) 8 (select to_char(to_date('2007-01-01','yyyy-MM-dd')+i,'yyyy-MM-dd'), 9 to_char(to_date('2007-01-01','yyyy-MM-dd')+i,'yyyy-MM'), 10 to_char(to_date('2007-01-01','yyyy-MM-dd')+i,'MM'), 11 to_char(to_date('2007-01-01','yyyy-MM-dd')+i,'q'), 12 to_char(to_date('2007-01-01','yyyy-MM-dd')+i,'ww'), 13 to_char(to_date('2007-01-01','yyyy-MM-dd')+i,'d'), 14 to_char(add_months(to_date('2007-01-01','yyyy-MM-dd')+i,-1),'yyyy-MM-dd'), 15 last_day(to_date('2007-01-01','yyyy-MM-dd')+i) 16 from dual 17 ); 18 i := i + 1; 19 end loop; 20 end;