SQL函式之日期函式

Allen-Li發表於2014-11-14

1. 使用 TO_CHAR() 和 TO_DATE() 轉換時間值

TO_CHAR(x[,format]) 將x轉換為字串,該函式還可以為x提供可選引數format

TO_DATE(x[,format]) 將字串x轉換為DATE型別,該函式也提供了可選引數format



1.1 使用TO_CHAR() 將時間值轉換為字串

select to_char(sysdate,'MONTH DD,YYYY,HH24:MI:SS') from dual;

1.2 使用TO_DATE() 將字串轉換為時間值

select to_date('04,JUL-2014'),to_date('04-JUL-12')  from dual;  --(未指定格式,採用預設日期格式)

select to_date('2014-09-13','YYYY-MM-DD') from dual;   (正確)

select to_date('2014-09-13','Y-MM-DD') from dual;        (錯誤)

故:FORMAT的作用是用於格式化傳遞的字串。

select to_date('11.1.14','MM.DD.YY') from dual;


2. Oracle 對年份的處理

注:應該始終使用完整的4位年份,這樣,就不會對到底指哪一年產生混淆


3. 使用時間值函式



4. 使用時區

時區是當地時間與英格蘭格林威治時間的時差(UTC)

時間也可以使用地理區域來指定,例如,PST 表示太平洋標準時間,它比UTC 晚8個小時

4.1 與時區有關的函式


4.2 將時間值從一個時區轉換為另一個時區

select to_char(NEW_TIME(to_date('25-MAY-2012 19:45'),'DD-MON-YYYY HH24:MI'),'PST','EST'),

'DD-MON-YYYY HH24:MI') from dual;


5. 使用時間戳


TIMESTAMP 'YYYY-MM-DD HH24:MI:SS.SSSSSSSSS'


6. 與時間戳有關的函式


select current_timestamp,localtimestamp,systimestamp from dual;


7. 使用時間間隔

注:時間間隔記錄的是一段時間長度(例如1年零3個月),而時間值或時間戳記錄的是特定的日期

和時間(例如2006年10月28日下午7點32分16秒)


7.1 使用INTERVAL YEAR TO MONTH 型別

CRATE TABLE coupons(

   coupon_id INTEGER CONSTARINT coupons_pk PRIMARY KEY,

   name VARCHAR2(30) NOT NULL,

   duration INTERVAL YEAR(3) TO MONTH

);

要向資料庫提供INTERVAL YEAR TO MONTH 字面值,可以使用下面的簡化語法:

INTERVAL  '[+|-][y][-m]'  [YEAR[(years_precision)]]  [TO MONTH]


7.2 使用INTERVAL DAY TO SECOND 型別

CREATE TABLE promotions

(

   promotion_id INTEGER CONSTRAINT promotions_pk PRIMARY KEY,

   name VARCHAR2(30) NOT NULL,

   duration INTERVAL DAY(5) TO SECOND(4)

);

要向資料庫提供INTERVAL DAY TO SECOND 字面值,可以使用下面的簡化語法:

INTERVAL '[+|-][d] [h[:m[:s]]]' [DAY[(days_precision]] 

[TO HOUR | TO_MINUTE | SECOND[(seconds_precision)]]



7. 與時間間隔有關的函式


7.1 NUMTODSINTERVAL()

SELECT NUMTODSINTERVAL(1.5,'DAY'),

                 NUMTODSINTERVAL(3.25,'HOUR'),

                 NUMTODSINTERVAL(5,'MINUTE'),

                 NUMTODSINTERVAL(10.12345,'SECOND')

FROM DUAL;

7.2 NUMTOYMINTERVAL()

SELECT NUMTOYMINTERVAL(1.5,'YEAR'),

                 NUMTOYMINTERVAL(3.25,'MONTH'),

                 NUMTOYMINTERVAL(3.7,'MONTH')         ==>  (四捨五入對月份)

FROM DUAL;


  select sysdate,add_months(sysdate,-12) from dual;     -- 減12個月
  select sysdate,add_months(sysdate,-1) from dual;       -- 減1個月
  select sysdate,to_char(sysdate-7,'yyyy-mm-dd hh24:mi:ss') from dual;     -- 減一個星期(7天)
  select sysdate,to_char(sysdate-1,'yyyy-mm-dd hh24:mi:ss') from dual;     -- 減一天
  select sysdate,to_char(sysdate-1/24,'yyyy-mm-dd hh24:mi:ss') from dual;      -- 減一小時
  select sysdate,to_char(sysdate-1/24/60,'yyyy-mm-dd hh24:mi:ss') from dual;       -- 減一分鐘
  select sysdate,to_char(sysdate-1/24/60/60,'yyyy-mm-dd hh24:mi:ss') from dual;       -- 減一秒鐘

















相關文章