Oracle日期函數和循環總結


一,日期相關的函數

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)

);

 

要求寫一個存儲過程

往這個測試表中插入數據

200711日到2008117

循環插入

 

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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM