天天看點

Oracle時間運算

目錄

=========================================

1.Oracle的日期函數

2.日期加減

3.月份加減

4.年份加減

5.求每月的最後一天

6.求每月的第一天

7.求下一個星期幾

入門知識:

①Oracle中的日期時間存儲:

oracle資料庫中存放時間格式的資料,是以oracle特定的格式存貯的,占7個位元組,與查詢時顯示的時間格式無關。不存貯秒以下的時間機關。

②Oracle中的日期時間顯示:

通常,用戶端與資料庫建立起連接配接後,oracle就會給一個預設的時間格式資料的顯示形式,與所使用的字元集有關。一般顯示年月日,而不顯示時分秒。

③Oracle中的日期時間插入:

向表中插入資料時,如果不使用轉換函數,則時間字段的格式必須遵從會話環境的時間格式,否則不能插入。

④Oracle中的日期時間格式修改:

a.SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';

b.冊表\hkey_local_machine\software\oracle\home0主鍵中增加一個字串(8i版本),字串名為nls_date_format,字串的值為你希望定義的時間格式

前者隻對目前會話有效,也即是一旦你關閉了SQL*PLUS視窗或重新打開一個SQL*PLUS視窗,日期時間格式依然采用本地字元集對應的日期時間格式。後者對所有用戶端應用有效。當兩者同時應用時,以alter session的修改為準。

一、Oracle的日期函數:

Oracle從8i開始就提供了大量的日期函數,這些日期函數包括對日期進行加減、轉換、截取等功能。下面是Oracle提供的日期函數一覽表 

Function Use
ADD_MONTHS Adds months to a date
LAST_DAY Computes the last day of the month
MONTHS_BETWEEN Determines the number of months between two dates
NEW_TIME Translates a time to a new time zone
NEXT_DAY Returns the date of the next specified weekday
ROUND Rounds a date/time value to a specified element
SYSDATE Returns the current date and time
TO_CHAR Converts dates to strings
TO_DATE

二、日期加減:

在Oralce中,對日期進行加減操作的預設機關是天,也就是說如果我們向目前日期加1的話是加上一天,而不是一秒或一小時。那麼對一天中的一段時間進行加減要怎麼做呢?很簡單!隻需将它們轉化為以天為機關即可。

【1】為目前時間加上30分鐘:

Oracle時間運算

SQL> select to_char(sysdate, 'yyyy-mm-dd hh:mi:ss') now_date,

Oracle時間運算

  2             to_char(sysdate+(30/24/60), 'yyyy-mm-dd hh:mi:ss') new_date

Oracle時間運算

  3    from dual;

Oracle時間運算
Oracle時間運算

NOW_DATE                               NEW_DATE

Oracle時間運算

-------------------------------------- --------------------------------------

Oracle時間運算

2008-06-30 10:47:31                    2008-06-30 11:17:31

Oracle時間運算
Oracle時間運算

SQL> 

我們看到了在綠色高亮處使用30/24/60将分鐘轉換成天。另外一個要注意的地方是:SQL*PLUS環境下預設的日期格式:NLS_DATE_FORMAT是DD-MM-YYYY,也即是不包含時、分、秒,是以我們這裡必須采用to_char的方式指定輸入的日期格式。

除此之外也可以通過在SQL*PLUS中執行下列語句修改預設的日期輸出格式,這樣的話就不需要通過to_char來轉換了,直接輸出就行。

Oracle時間運算

alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

【2】為目前時間減去30分鐘:

Oracle時間運算

SQL> select to_char(sysdate+(-30/24/60),'yyyy-mm-dd hh:mi:ss') new_date from dual;

Oracle時間運算
Oracle時間運算

NEW_DATE

Oracle時間運算

--------------------------------------

Oracle時間運算

2008-06-30 10:24:59

隻需要加上一個負數即可以了。

三、月份加減:

月份的加減和日期加減相比要難了很多,因為每個月份的天數并不是固定的,可能是31,30,29,28。如果采用上面的方法将月份轉換成實際天數将不可避免地出現多個判斷,幸虧Oracle為我們提供了一個add_months函數,這個函數會自動判斷月份的天數。看看下面的例子:

【1】為目前時間加上6個月:

Oracle時間運算

SQL> select add_months(sysdate, 6) from dual;

Oracle時間運算
Oracle時間運算
Oracle時間運算

----------

Oracle時間運算

31-12月-08

【2】為目前時間減去6個月:

Oracle時間運算

SQL> select add_months(sysdate, -6) from dual;

Oracle時間運算
Oracle時間運算
Oracle時間運算
Oracle時間運算

31-12月-07

【3】求兩個日期相差的月數:

通常情況下兩個時間相減将得到以天數為機關的結果,可是有時我們更希望得到以月為機關的結果,如果手動轉換這太麻煩了,是以Oracle又提供了一個函數,這個函數就是months_between。

Oracle時間運算

SQL> select months_between(sysdate,

Oracle時間運算

  2         to_date('2008-01-01 01:00:00', 'yyyy-mm-dd hh:mi:ss')) result

Oracle時間運算
Oracle時間運算
Oracle時間運算

    RESULT

Oracle時間運算
Oracle時間運算

5.94928203

months_between函數有2個參數,第一個參數是結束日期,第二個參數是開始日期,Oracle用第一個參數減去第二個參數得到月份數。是以結果有可能會是負數的。

四、年份加減:

Oracle并不直接提供對年份進行加減的函數,不過有了add_months和months_between函數,我們照樣可以做到。

【1】為目前日期加上2年:

Oracle時間運算

SQL> select add_months(sysdate, 2*12) two_years_later

Oracle時間運算

  2      from dual;

Oracle時間運算
Oracle時間運算

TWO_YEARS_

Oracle時間運算
Oracle時間運算

30-6月 -10

【2】求兩個日期相差幾年:

Oracle時間運算

SQL> select months_between(sysdate, 

Oracle時間運算

  2         to_date('2006-06-30', 'yyyy-mm-dd')) / 12 years_between

Oracle時間運算
Oracle時間運算
Oracle時間運算

YEARS_BETWEEN

Oracle時間運算

-------------

Oracle時間運算

            2

直接将兩個日期相減,然後除以365天并不準确,但是不管一年有多少天它總是隻有12個月,是以利用這一點我們可以先求出兩個日期相差的月數,再除以12就得出相差的年數了

五、求每月的最後一天:

Oracle時間運算

SQL> select last_day(add_months(sysdate,2)) last_day

Oracle時間運算

  2    from dual;

Oracle時間運算
Oracle時間運算
Oracle時間運算
Oracle時間運算

31-8月 -08

六、求每月的第一天:

Oracle提供了last_day讓我們能夠求出所在月份的最後一天,但沒有對應的first_day函數,如果有這方面的需求,隻需要稍微動一下腦筋,利用last_day函數即可。例如下面的SQL語句就是求出下個月的第一天:

Oracle時間運算

SQL> select last_day(sysdate)+1 fisrt_day

Oracle時間運算
Oracle時間運算
Oracle時間運算

FISRT_DAY

Oracle時間運算
Oracle時間運算

01-7月 -08

在這裡我們将“每月的第一天”轉換成“上個月最後一天的下一天”,問題就解決了!

七、求下一個星期幾:

有時候我們會碰上“下個星期五是幾号啊?”這樣常見的問題。Oracle為此提供了一個函數:next_day,它的文法是這樣的:next_day(date, string)。其中第一個參數date告訴Oracle從什麼時候開始算起,第二個參數string則告訴Oracle要取的工作日。

下面我們看看如何得到下個星期五的日期:

Oracle時間運算

SQL> select next_day(sysdate, 'Friday') "Next Friday" from dual;

Oracle時間運算

select next_day(sysdate, 'Friday') "Next Friday" from dual

Oracle時間運算

                         *

Oracle時間運算

ERROR at line 1:

Oracle時間運算

ORA-01846: 周中的日無效

很奇怪!是不?明明文法沒有問題,但為什麼會說“周中的日無效”呢?這裡就不得不說到Oracle中的語言和時區的問題了。下面這張圖是使用TOAD截取出來的用戶端session的語言和時區資訊:

Oracle時間運算

圖一

從圖中我們知道了用戶端的語言是簡體中文,日期使用的語言也是簡體中文,這就是為什麼上面的SQL語句出錯的原因了,因為在中文中隻有“星期一,星期二”這樣的工作日表示,而沒有“Monday,Firday”這樣的寫法!

Oracle時間運算

SQL> select next_day(sysdate,'星期五') "下周五" from dual;

Oracle時間運算
Oracle時間運算

下周五

Oracle時間運算
Oracle時間運算

04-7月 -08

如果你不确定自己的時區或者你擔心從一個時區移植到另一個時區時,SQL語句會出錯,Oracle還允許你用數字的形式來表示工作日。但是要記得一點:1表示的是周日,2表示的是周一,3表示的是周二,依此類推。

例如我要查下個周三是什麼時候,則函數是這樣寫的:next_day(sysdate, 4)。

Oracle時間運算

SQL> select next_day(sysdate,4) from dual;

Oracle時間運算
Oracle時間運算

NEXT_DAY(S

Oracle時間運算
Oracle時間運算

02-7月 -08

Oracle時間運算

看一下月曆是不是正确的,确實不錯!呵呵