oracle中提供了日期型來處理與日期相關的應用。其中,最常用的類型爲date和timestamp。
本接下來,將講述日期類型的基本信息及處理方法,主要內容包括:
日期型簡介
日期型函數。
1. oracle中的日期型
oracle中的date類型實際包含了以下信息。
century:世紀信息
year:年份信息
month:月份信息
day:天數信息
hour:小時信息
minute:分鐘信息
second:秒數信息。
除此之外,oracle還提供了timestamp(時間戳)類型,該類型用於表徵更加精確的時間,精確度可以達到毫秒級。
2. oracle中的日期處理
2.1 獲得當前日期----sysdate()函數
該函數用法返回當前日期,如下所示:
SQL>select sysdate from dual;
該執行結果,可以顯示當前日期的年、月、日、時、分、秒等信息。
2.2 爲日期加上特定月份----add_months()函數
對於一個日期型來說,一個常見應用爲添加固定月數。
例如:
勞動法規定,員工自遞交辭職報告一個月之後將自動離職,那麼可以利用add_months()函數自動計算員工的離職日期。
SQL>select add_months(sysdate, 1) new_date from dual;
將該數據插入到數據庫中,即可在系統中實現員工離職的預警信息。
但是,在一年之中,各個月的天數並不相同,因此在添加特定月份時,需要注意oracle的特殊處理方式。
SQL>select add_months(to_date('2010-2-27','yyyy--mm--dd'), 1 ) new_date from dual;
------
2010-3-27
2010年爲平年,其二月份有28天。當我們利用2010-2-27日添加一個月時,2010年3月27日是一個有效日期,因此返回值爲2010-3-27。但是,2010年2月28日是2月份的最後一天,爲該日期添加一個月之後,返回值爲3月份的最後一天,如下所示。
SQL>select add_months(to_date('2010-2-28','yyyy-mm-dd'), 1) new_date from dual;
----------------
2010-3-31
同樣的,當直接增加月份之後的日期爲非法日期時,oracle將返回該月的最後一天。
SQL>select add_months(to_date('2010-1-29','yyyy-mm-dd'), 1 ) new_date from dual;
-------------------------
2010-2-28
SQL>select add_months(to_date('2010-1-30','yyyy-mm-dd'), 1 ) new_date from dual;
-------------------------
2010-2-28
SQL>select add_months(to_date('2010-1-30','yyyy-mm-dd'), 1 ) new_date from dual;
------------------------
2010-2-28
上面可以看出,2010-1-29、2010-1-30、2010-1-31添加一個月之後,都將返回2010-2-28.
2.3 返回特定日期所在月的最後一天----last_day()函數
last_day()函數可以用於返回某個日期所在月份的最後一天,返回值同樣爲一個日期型。
SQL>select last_day(to_date('2010-2-28','yyyy-mm-dd')) new_date from dual;
------------------------
2010-2-28
SQL>select last_day(to_date('2000-2-28','yyyy-mm-dd')) new_date from dual;
------------------
2000-2-29
last_day(to_date('2010-2-28','yyyy-mm-dd'))用於返回2010年2月28日,所在月份---2月份的最後一天,返回值爲2010-2-28.通過該返回值可知,2010年爲平年;而last_day(to_date('2000-2-28','yyyy-mm-dd'))的返回值爲2000-2-29,表明2010年爲閏年。
2.4 返回兩個日期所差的月數------months_between()函數
months_between()函數用於返回兩個日期相減獲得的月數,該函數的返回值並不一定爲整數,如下所示:
SQL>select months_between(to_date('2010-4-4','yyyy-mm-dd')), to_date('2010-2-6','yyyy-mm--dd') as new_date from dual;
---------------
1.93548387096774
分析查詢結果可知,2010-4-4與2010-2-6之間相差的月份數爲一個小數,除此之外,如果第一個參數所代表的日期小於第二個參數,那麼monts_between()函數將返回一個負數,如下所示。
SQL>select months_between(to_date('2010-4-4','yyyy-mm-dd')), to_date('2010-2-6','yyyy-mm--dd') as new_date from dual;
---------------
-1.9354838對於非整數月份,oracle的計算規則爲非整數天數除以31.例如:2010-2-6至2010-3-6爲一個月,而2010-3-6至2010-4-4之間的天數爲29天。所以Months_between()函數的返回值爲1+29/31=1.93548387096774
2.5 返回特定日期之後的一週內的日期----next_day()函數
next_day()函數用於獲得特定日期之後的一個星期之內的日期,例如:2010-4-4是星期日,那麼爲了獲得緊隨其後的第一個星期一,可以利用如下語句:
SQL>select next_day(to_date('2010-4-4','yyyy-mm-dd'), 2 ) new_date from dual;
----------------------
2010-4-5
next_day(to_date('2010-4-4','yyyy-mm-dd'), 2 )中的第一個參數to_date('2010-4-4','yyyy-mm-dd')指定起始日期;2代表星期一;該函數返回2010-4-4之後的第一個星期一,即2010-4-5.
在oracle中,1代表星期日,2代表星期一,3代表星期二,以此類推。因此,2010-4-4之後的第一個星期日,應該使用如下SQL語句獲取。
SQL>select next_day(to_date('2010-4-4','yyyy-mm-dd'), 1 ) new_date from dual;
-----------------
2010-4-11
2.6 截取日期----trunc()函數
trunc()函數不僅可以截取數字,而且可以截取日期,其工作原理與截取數字非常相似。其使用語法如下所示。
trunc(日期,截取格式)
爲了使用該函數,不僅需要指定日期原始值,而且要指定截取格式----即截取到日期的哪個部分。
SQL>select trunc(sysdate,'DD') new_date from dual;
-----------------
2010-4-5
trunc(sysdate,'DD') 用於將當前日期截取到天,獲得結果2010-4-5.
SQL>select trunc(sysdate,'MM') new_date from dual;
------------------
2010-4-1
trunc(sysdate,'MM') 用於將當前日期截取到月,獲得的結果爲2010-4-1,即爲當前月份的第一天。
SQL>select trunc(sysdate,'MI') new_date from dual;
--------------------
2010-4-5 15:44:00
trunc(sysdate,'MI') 用於將當前日期截取到分鐘。
2.7 返回當前會話時區的當前日期-----currrent_date()函數
current_date()函數用於返回當前時區下的當前日期,我們可以結合當前日趨來查看current_date()函數的使用。
SQL>select sessiontimezone, to_char(current_date, 'yyyy-mm-dd hh:mi:ss') result from dual;
SESSIONTIMEZONE RESULT
------------------------------ -------------------------------
+08:00 2010-04-05 05:46:26
sessiontimezone用於返回當前時區,+08:00表明當前時區爲東八區;to_char(current_date,'yyyy-mm-dd hh:mi:ss')返回當前日期。
2.8 返回當前會話時區的時間戳----current_timestamp()函數
current_timestamp()函數用於返回當前時區下的當前時間戳,可以結合當前時區查看current_timestamp()函數的使用。
SQL>select seesiontimezone, current_timestamp from dual;
SESSIONTIMEZONE CURRENT_TIMESTAMP
------------------------- -------------------------------------------------
+8:00 05--4月 -10 04.51.11.640000 下午 +8:00
2.9 返回日期的某個域-------extract()函數
日期中的年、月、日、時、分、秒等可以看做日期的域,extract()函數可以從一個日期中分解出各個域,其使用語法如下所示。
extract(域名,from 日期)
爲了從當前日期中分解出月份,可以利用如下所示的SQL語句。
SQL>select extract(month from sysdate ) new_month from dual;
--------------------------
4
extract(month from sysdate ) 中的month爲月份的域代碼,該函數從當前日期中分解出月份。
但是,需要注意的是,在日期型中無法分解出小時、分鐘、秒等信息。
SQL>select extrace(hour from sysdate ) new_date from dual;
select extract(hour from sysdate ) new_date from dual;
ORA-30076: invalid extract field for extract source
上面報錯表明數據源中並不含有Hour域,要想獲得小時信息,則必須使用日期時間型作爲數據源。
SQL>select extract(hour from systimestamp) new_hour from dual;
extract(hour from systimestamp) 從當前時間戳中後的小時信息,但需要注意的是,此時的小時信息爲零時區的標準時間。
2.10 將日期轉換爲字符串------to_char()函數
to_char()函數不僅可以用於數值的格式化,同樣可以對日期進行格式化。to_char()函數格式化日期的使用方法如下所示:
to_char(日期,格式)
例如:爲了以yyyy-mm-dd的格式顯示當前日期,那麼可以利用如下SQL語句。
SQL>select to_char(sysdate, 'YYYY-MM-DD') new_date from dual;
---------------
2010-04-05
to_char(sysdate,'yyyy-mm-dd') 用於獲得當前日期的yyyy-mm-dd的格式,返回值爲2010-04-05