【數據庫】Oracle中的日期型及處理方法

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


發佈了53 篇原創文章 · 獲贊 12 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章