oracle中的單行函式(三)

pingley發表於2012-02-26
oracle中的單行函式(三)
Oracle預設的時間呈現格式是:DD-MON-YYOracle儲存時間的範圍是:January 1, 4712 B.C. to December31, 9999 AD。實際上使用數值的格式來儲存的,所以使用者可以對時間進行運算操作。
MONTHS_BETWEEN(d1, d2),計算d1與d2的月份差。返回的月份是帶小數點的,可以使用trunc或者round得到
需要的值。
SQL> select title,trunc(months_between(orderdate,pubdate),0) "Month"
  2  from books join orderitems using (isbn)
  3  join orders using(order#)
  4  where order#=1004;
TITLE                               Month
------------------------------ ----------
PAINLESS CHILD-REARING                 56        //計算訂購日期與出版日期相差多少個月.
ADD_MONTHS(d, m) d表示開始計算的起始時間,M表示需要增加的月份的數.計算出增加m個月後的今天是什麼日期。
SQL> select add_months(sysdate,5) from dual;
ADD_MONTH
---------
26-JUL-12             //7個月以後的今天是2012-07-12.
NEXT_DAY(d, DAY),d表示的是開始計算起始的日期,day表示下一個星期的星期幾的日期。
SQL> select next_day(sysdate,1) from dual;
NEXT_DAY(
---------                      //下一個週一是什麼日期。
04-MAR-12
SQL> select order#,orderdate,next_day(orderdate,2) "Should Shipdate"
  2  from orders
  3  where order#=1010;
    ORDER# ORDERDATE Should Sh
---------- --------- --------- //訂貨以後下週週二必須發貨。
      1010 03-APR-09 06-APR-09
LAST_DAY總是返回一個月的最後一天。
SQL> select last_day(sysdate) from dual;
LAST_DAY(
---------
29-FEB-12         //檢視本月的最後一天是什麼日期。可見2012年還是閏年。
SQL> select order#,orderdate,last_day(orderdate)
  2  from orders
  3  where order# in (1002,1003);
    ORDER# ORDERDATE LAST_DAY(
---------- --------- ---------
      1002 31-MAR-09 31-MAR-09
      1003 01-APR-09 30-APR-09
很多人在輸入日期的時候,不適應oracle的預設的日期形式DD-MON-YY.oracle中的TO_DATE函式。可以讓運用程式開發員,指定符合使用者輸入習慣或者組織規範的日期格式。
TO_DATE('d', 'f')d表示輸入的日期,f表示指示oracle識別的日期格式。兩個時間引數都是字串,要用單引號括起來。
常用的日期格式有
MONTH:完整的月份拼寫,如果不足9個字元用空格補齊,比如APRIL.
MON:3個字元的月份縮寫,APR。
MM:2個數值表示的月份,比如 02.
RM:羅馬字元代表的月份,比如 IV。
D:數值表示的星期幾,4(週四).
DD:數值表示的一個月中的某一天,27(一個月中的第28天).
DDD:數值表示的一年中的某一天,300(一年中的第300天).
DAY:星期幾,如果不足9個字元用空格補齊,比如 WEDNESDAY.
DY:3個字元的星期幾的縮寫,WED。
YYYY:4個數值表示的年份,比如2012.
B.C. OR A.D.:表示是公元前還是公元,比如2012 A.D.
SQL> create table testdate (tdate date);
Table created.
SQL> insert into testdate values('01-MAR-12');
1 row created.
SQL> insert into testdate values('2012-03-01');
insert into testdate values('2012-03-01')
                           *
ERROR at line 1:
ORA-01861: literal does not match format string
不使用to_date函式就要按照oracle預設的日期格式來輸入。
SQL> insert into testdate values(to_date('2012-03-01','yyyy-mm-dd'));
1 row created.              //輸入的日期格式不是預設的DD-MON-YY。
SQL> commit;
Commit complete.
SQL> select * from testdate;
TDATE
---------
01-MAR-12
01-MAR-12
使用to_date函式的時候,oracle還是按照他預設的日期格式來顯示輸出。但是輸入就不是預設的了。如果要插入的日期格式是ANSI 格式的日期 YYYY-MM-DD,可以使用date關鍵字.
SQL> insert into testdate values(date '2012-03-01');
1 row created.
round函式在日期函式中的運用,ROUND(d, u)。d代表的是日期資料,u表示四捨五入的單位(月份或者年份)。對於月份如果超過或者等於16號,計數到下一個月的1號。對於年份,如果超過或者等7月16號,計數到下一年的1月1號。
SQL> delete from testdate;
3 rows deleted.
插入下面的4條記錄。
insert into testdate values(date '2012-03-16');
insert into testdate values(date '2012-03-06');
insert into testdate values(date '2012-06-16');
insert into testdate values(date '2012-07-16');
SQL> select round(tdate,'year') from testdate;
ROUND(TDA
---------
01-JAN-12
01-JAN-12
01-JAN-12
01-JAN-13
對於年份的舍入,如果沒有超過7月16號,都被轉換成了日期對應年份的1月1號。
SQL> select round(tdate,'month') from testdate;
ROUND(TDA
---------
01-APR-12
01-MAR-12
01-JUL-12
01-AUG-12
對應月份的舍入,如果沒有超過該月的16號,都被轉換成了該月的1號。
SQL> select * from testdate;
TDATE
---------
16-MAR-12
06-MAR-12
16-JUN-12
16-JUL-12
當然表中實際儲存的資料是沒有被改動的。

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

相關文章