1. 程式人生 > >oracle_數值型別函式和日期函式

oracle_數值型別函式和日期函式

數值型函式
ROUND
TRUNC
MOD
CEIL
power

ROUND(列名|表示式,n)
四捨五入到小數點後的n位
idle> select round(458.734,0),round(458.734,1),round(458.734,-1) from dual;

ROUND(458.734,0) ROUND(458.734,1) ROUND(458.734,-1)
---------------- ---------------- -----------------
459 458.7 460

idle>

TRUNC(列名|表示式,n)
擷取到小數點後的n位
idle> select trunc(458.734,0),trunc(458.734,1),trunc(458.734,-1) from dual


TRUNC(458.734,0) TRUNC(458.734,1) TRUNC(458.734,-1)
---------------- ---------------- -----------------
458 458.7 450

idle>


MOD(m,n)
求m除以n的餘數
idle> select mod(10,3) from dual;

MOD(10,3)
----------
1

idle>
idle> select mod(3,10) from dual;

MOD(3,10)
----------
3

idle>

CEIL 取整 向上補1 和trunc相反
idle> select ceil(457.001) from dual; 後面只要有小數,就進一

CEIL(457.001)
-------------
458

idle>


power(底數,指數) 求次方

SQL> select power(10,3) from dual;

POWER(10,3)
-----------
1000

SQL>

日期函式

日期函式的處理

如果你對當前系統的日期格式 看這不舒服 可以修改當前會話的顯示格式
idle> alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';

Session altered.

idle> select sysdate from dual;

SYSDATE
-------------------
2010-12-17 08:52:31

idle> 這是OS系統時間 資料庫本身沒時間 只有SCN號
日期可以直接參與運算
idle> select sysdate-10 from dual;

SYSDATE-10
-------------------
2010-12-07 08:53:16

兩個日期型資料相減會得到相差的天數
idle> select to_date('2010-12-30')-sysdate from dual;

TO_DATE('2010-12-30')-SYSDATE
-----------------------------
12.6290856

idle>
可以將日期型的資料和一個小時數相加減 這個數要除以24
idle> select sysdate from dual;

SYSDATE
-------------------
2010-12-17 08:55:56

idle> select sysdate + 5/24 from dual;

SYSDATE+5/24
-------------------
2010-12-17 13:55:56

idle>

計算scott的工齡
idle> select ename,(sysdate-hiredate)/365 "years" from emp where ename='SCOTT';

ENAME years
---------- ----------
SCOTT 23.6804732
 

日期函式的處理

如果你對當前系統的日期格式 看這不舒服 可以修改當前會話的顯示格式
idle> alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';

Session altered.

idle> select sysdate from dual;

SYSDATE
-------------------
2010-12-17 08:52:31

idle> 這是OS系統時間 資料庫本身沒時間 只有SCN號
日期可以直接參與運算
idle> select sysdate-10 from dual;

SYSDATE-10
-------------------
2010-12-07 08:53:16

兩個日期型資料相減會得到相差的天數
idle> select to_date('2010-12-30')-sysdate from dual;

TO_DATE('2010-12-30')-SYSDATE
-----------------------------
12.6290856

idle>
可以將日期型的資料和一個小時數相加減 這個數要除以24
idle> select sysdate from dual;

SYSDATE
-------------------
2010-12-17 08:55:56

idle> select sysdate + 5/24 from dual;

SYSDATE+5/24
-------------------
2010-12-17 13:55:56

idle>

計算scott的工齡
idle> select ename,(sysdate-hiredate)/365 "years" from emp where ename='SCOTT';

ENAME years
---------- ----------
SCOTT 23.6804732

idle>

日期型函式
MONTHS_BETWEEN
ADD_MONTHS
NEXT_DAY
LAST_DAY
ROUND 和 TRUNC 對日期的取捨

MONTHS_BEWTEEN(日期1,日期2)
如果日期1大於日期2返回正數,日期1小於日期2返回負數
idle> select months_between('2010-10-10','2010-12-10') from dual;

MONTHS_BETWEEN('2010-10-10','2010-12-10')
-----------------------------------------
-2

idle> select months_between('2010-12-10','2010-10-10') from dual;

MONTHS_BETWEEN('2010-12-10','2010-10-10')
-----------------------------------------
2

idle>

ADD_MONTHS(日期,n)
把n個月加到日期上
idle> select add_months('2010-10-10',3) from dual;

ADD_MONTHS('2010-10
-------------------
2011-01-10 00:00:00

idle>

NEXT_DAY(日期,星期)
從當天算起,求下一個指定星期幾是幾號. 如果是中文系統將MONDAY改成"星期一"
idle> select next_day(sysdate,'MONDAY') from dual;

NEXT_DAY(SYSDATE,'M
-------------------
2010-12-20 09:02:06

idle>
idle> select next_day(sysdate,'fri') from dual;

NEXT_DAY(SYSDATE,'F
-------------------
2010-12-24 09:02:44

idle>

LAST_DAY(日期)
返回該日期的所在月的最後一天

idle> select last_day(sysdate) from dual;

LAST_DAY(SYSDATE)
-------------------
2010-12-31 09:03:26

idle>

idle> alter session set nls_date_format='YYYY-MM-DD';

Session altered.
idle> select ename,hiredate,last_day(hiredate),next_day(hiredate,'SUN'),months_between(sysdate,hiredate) "MON",ADD_MONTHS(hiredate,3) from emp
where ename='SCOTT';

ENAME HIREDATE LAST_DAY(H NEXT_DAY(H MON ADD_MONTHS
---------- ---------- ---------- ---------- ---------- ----------
SCOTT 1987-04-19 1987-04-30 1987-04-26 283.947709 1987-07-19

idle>



1-31
15

0-23:59
12

ROUND(date,'[day|month|year]') 和 trunc(date,'[day|month|year]') 應用於日期型資料
數字的進位和擷取是以小數點為中心,而日期的進位和擷取是以年月日時分秒為中心

idle> select round('2010-10-10','MONTH') from dual;
select round('2010-10-10','MONTH') from dual
*
ERROR at line 1:
ORA-01722: invalid number
因為round不能處理字元型資料,所以報錯,我們要將字元型資料轉換為日期型

idle> select round(to_date('2010-10-10'),'MONTH') from dual;

ROUND(TO_DATE('2010
-------------------
2010-10-01 00:00:00

idle>
這是按月為單位進行四捨五入 因為10號是16號以前 所以得到10.1日

月為單位的四捨五入的分割線
idle> select round(to_date('2010-10-15'),'MONTH'),trunc(to_date('2010-10-15')) from dual;

ROUND(TO_DATE('2010 TRUNC(TO_DATE('2010
------------------- -------------------
2010-10-01 00:00:00 2010-10-15 00:00:00

idle> select round(to_date('2010-10-16'),'MONTH'),trunc(to_date('2010-10-16')) from dual;

ROUND(TO_DATE('2010 TRUNC(TO_DATE('2010
------------------- -------------------
2010-11-01 00:00:00 2010-10-16 00:00:00

idle>

年為單位的四捨五入分割線
idle> select round(to_date('2010-06-30'),'year'),trunc(to_date('2010-06-30'),'year') from dual;

ROUND(TO_DATE('2010 TRUNC(TO_DATE('2010
------------------- -------------------
2010-01-01 00:00:00 2010-01-01 00:00:00

idle> select round(to_date('2010-07-01'),'year'),trunc(to_date('2010-07-01'),'year') from dual;

ROUND(TO_DATE('2010 TRUNC(TO_DATE('2010
------------------- -------------------
2011-01-01 00:00:00 2010-01-01 00:00:00

idle>

DD-MON-RR
DD-MON-YY
YY 永遠都引用當前年份的世紀部分補齊

13
2013
RR 13
2013 1913

RR與 YY的區別

84 -- > YY 2013 --> 2084
RR

20

如果輸入的兩位數是00-49:

如果當前年份屬於00-49,則返回成本世紀所在年份;2020

如果當前年份屬於50-99,則返回成上世紀所在年份。

如果輸入的兩位數是50-99:

如果當前年份屬於00-49,則返回成上世紀所在年份 1984

如果當前年份屬於50-99,則返回成本世界所在年份



SQL> select to_date('18-may-91','DD-MON-RR') FROM DUAL;

TO_DATE('18-MAY-91'
-------------------
1991-05-18 00:00:00

SQL> select to_date('18-may-91','DD-MON-YY') FROM DUAL;

TO_DATE('18-MAY-91'
-------------------
2091-05-18 00:00:00

SQL>