【轉】oracle 數值型函數,字符型函數,日期函數,轉換函數,to_char,自動類型轉換,日期類型轉換

數值型函數
abs:求絕對值函數,如:abs(−5) 5
sqrt:求平方根函數,如:sqrt(2) 1.41421356
power:求冪函數,如:power(2,3) 8
cos:求餘弦三角函數,如:cos(3.14159) −1
mod:求除法餘數,如:mod(1600, 300) 100
ceil:求大於等於某數的最小整數,如:ceil(2.35) 3
floor:求小於等於某數的最大整數,如:floor(2.35) 2
round:按指定精度對十進制數四捨五入,如:round(45.923, 1),結果,45.9
round(45.923, 0),結果,46
round(45.923, −1),結果,50
trunc:按指定精度截斷十進制數,如:trunc(45.923, 1),結果,45.9
trunc(45.923),結果,45
trunc(45.923, −1),結果, 40

使用數值型函數練習。
使用求絕對值函數abs。

Sql代碼
  1. SELECT   abs (?5)  FROM  dual;  
SELECT abs(?5) FROM dual;


執行結果:
  ABS(?5)
---------------
        5
說明:求?5的絕對值,結果爲5。

字符型函數

ascii:獲得字符的ASCII碼,如:Ascii('A') 65
chr:返回與ASCII碼相應的字符,如:Chr(65) A
lower:將字符串轉換成小寫,如:lower ('SQL Course') sql course
upper:將字符串轉換成大寫,如:upper('SQL Course') SQL COURSE
initcap:將字符串轉換成每個單詞以大寫開頭,如:initcap('SQL course') Sql Course
concat:連接兩個字符串 concat('SQL', ' Course') SQL Course
substr:給出起始位置和長度,返回子字符串,如:substr('String',1,3) Str
length:求字符串的長度 length('Wellcom') 7
instr:給出起始位置和出現的次數,求子字符串在字符串中出現的位置,如:instr('String', 'r',1,1) 3
lpad:用字符填充字符串左側到指定長度,如:lpad('Hi',10,'-') --------Hi
rpad:用字符填充字符串右側到指定長度,如:rpad('Hi',10,'-') Hi--------
trim:在一個字符串中去除另一個字符串,如:trim('S' FROM 'SSMITH') MITH
replace:用一個字符串替換另一個字符串中的子字符串,如:replace('ABC', 'B', 'D') ADC

如果不知道表的字段內容是大寫還是小寫,可以轉換後比較。
輸入並執行查詢:

Sql代碼
  1. SELECT   empno, ename, deptno     FROM  emp  
  2.         WHERE    lower (ename) = 'blake' ;  
SELECT  empno, ename, deptno	FROM emp
		WHERE  lower(ename) ='blake';


結果爲:

   
Sql代碼
  1. EMPNO ENAME          DEPTNO  
  2.     --------------- ---------- ------------------------   
  3.              7698 BLAKE              30  
 EMPNO ENAME          DEPTNO
		--------------- ---------- ------------------------
     		 7698 BLAKE              30


說明:該查詢將表中的僱員名轉換成小寫,與小寫的blake進行比較。

日期函數

months_between:返回兩個日期間的
月份,如:months_between ('04-11月-05','11-1月-01'),結果,57.7741935
add_months:返回把月份數加到日期上的新日期,如:add_months('06-2月-03',1),結果,06-3月-03
add_months('06-2月-03',-1),結果,06-1月-03
next_day:返回指定日期後的星期對應的新日期,如:next_day('06-2月-03','星期一'),結果,10-2月-03
last_day:返回指定日期所在的月的最後一天,如:last_day('06-2月-03'),結果,28-2月-03
round:按指定格式對日期進行四捨五入,如:round(to_date('13-2月-03'),'YEAR'),結果,01-1月-03
round(to_date('13-2月-03'),'MONTH'),結果,01-2月-03
round(to_date('13-2月-03'),'DAY'),結果,16-2月-03

(按週四舍五入)
trunc:對日期按指定方式進行截斷,如:trunc(to_date('06-2月-03'),'YEAR'),結果,01-1月-03
trunc(to_date('06-2月-03'),'MONTH'),結果,01-2月-03
trunc(to_date('06-2月-03'),'DAY'),結果,02-2月-03

(按周截斷)

返回2003年2月的最後一天。
輸入並執行查詢:

Sql代碼
  1. SELECT  last_day( '08-2月-03' FROM  dual;  
SELECT last_day('08-2月-03') FROM dual;


返回結果爲:

Sql代碼
  1. LAST_DAY('  
  2.         ----------------   
  3.         28-2月-03  
LAST_DAY('
		----------------
		28-2月-03


說明:該函數給定參數爲某月份的任意一天,返回時間爲該月份的最後一天。本例中,參數爲03年2月8號,返回日期爲03年2月28日,是該月的最後一天。

假定當前的系統日期是2003年2月6日,求再過1000天的日期。
輸入並執行查詢:

Sql代碼
  1. SELECT  sysdate+1000  AS   "NEW DATE"   FROM  dual;  
SELECT sysdate+1000 AS "NEW DATE" FROM dual;


返回結果爲:

Sql代碼
  1. NEW  DATE   
  2.         ----------------   
  3.         04-11月-05   
NEW DATE
		----------------
		04-11月-05 


說明:該查詢使用到了日期的加法運算,求經過一定天數後的新日期。

假定當前的系統日期是2003年2月6日,顯示部門10僱員的僱傭天數。
輸入並執行查詢:

Sql代碼
  1. SELECT  ename, round(sysdate-hiredate) DAYS  
  2.         FROM    emp  
  3.         WHERE   deptno = 10;  
SELECT ename, round(sysdate-hiredate) DAYS
		FROM   emp
		WHERE  deptno = 10;


返回結果爲:
ENAME            DAYS
--------------- ---------------------
CLARK           7913
KING             7752
MILLER          7685
說明:該查詢使用日期的減法運算求兩個日期的相差天數。用round函數對天數進行四捨五入。

轉換函數
Oracle的類型轉換分爲自動類型轉換和強制類型轉換。常用的類型轉換函數有TO_CHAR、TO_DATE或TO_NUMBER

To_char:轉換成字符串類型,如:To_char(1234.5, '$9999.9'),結果:$1234.5
To_date:轉換成日期類型,如:To_date('1980-01-01', 'yyyy-mm-dd'),結果:01-1月-80
To_number:轉換成數值類型,如:To_number('1234.5'),結果:1234.5

自動類型轉換
Oracle可以自動根據具體情況進行如下的轉換:
* 字符串到數值。
* 字符串到日期。
* 數值到字符串。
* 日期到字符串。
以下是自動轉換的訓練。
自動轉換字符型數據到數值型。
輸入並執行查詢:

Sql代碼
  1. SELECT   '12.5' +11  FROM  dual;  
SELECT '12.5'+11 FROM dual;


執行結果爲:

Sql代碼
  1. '12.5' +11  
  2.         ------------   
  3.          23.5  
'12.5'+11
		------------
   		 23.5


說明:在本訓練中,因爲出現+運算符,說明進行的是算術運算,所以字符串'12.5'被自動轉換成數值12.5,然後參加運算。

自動轉換數值型數據到字符型。
執行以下查詢:

Sql代碼
  1. SELECT   '12.5' ||11  FROM  dual;  
SELECT '12.5'||11 FROM dual;


結果爲:

Sql代碼
  1. '12.5'   
  2.         ------   
  3.         12.511  
'12.5'
		------
		12.511


說明:在本訓練中,因爲出現||運算符,說明進行的是字符串連接運算,數值11被自動轉換成字符串'11',然後參加運算。

日期類型轉換
將日期型轉換成字符串時,可以按新的格式顯示。
如格式YYYY-MM-DD HH24:MI:SS表示“年-月-日 小時:分鐘:秒”。Oracle的日期類型是包含時間在內的。
主要的日期格式字符的含義

AM、PM:上午、下午,如:08 AM
D:數字表示的星期(1~7),如:1,2,3,4,5,6,7
DD:數字表示月中的日期(1~31),如:1,2,3,…,31
MM:兩位數的月份,如:01,02,…,12
Y、YY、YYY、YYYY 年份的後幾位,如:3,03,003,2003
RR:解決Y2K問題的年度轉換
DY:簡寫的星期名,如:MON,TUE,FRI,…
DAY:全拼的星期名,如:MONDAY,TUESDAY,…
MON:簡寫的月份名,如:JAN,FEB,MAR,…
MONTH:全拼的月份名,如:JANUARY,FEBRUARY,…
HH、HH12:12小時制的小時(1~12),如:1,2,3,…,12
HH24:24小時制的小時(0~23),如:0,1,2,…,23
MI:分(0~59),如:0,1,2,…,59
SS:秒(0~59),如:0,1,2,…,59
,./-;: 原樣顯示的標點符號
'TEXT':引號中的文本原樣顯示,如:TEXT

將日期轉換成帶時間和星期的字符串並顯示。
執行以下查詢:

Sql代碼
  1. SELECT  TO_CHAR(sysdate, 'YYYY-MM-DD HH24:MI:SS AM DY' FROM  dual;  
SELECT TO_CHAR(sysdate,'YYYY-MM-DD HH24:MI:SS AM DY') FROM dual;


結果爲:

Sql代碼
  1. TO_CHAR(SYSDATE,'YYYY-MM-DD HH24  
  2.         ----------------------------------------------------------   
  3.         2004-02-07 15:44:48 下午 星期六  
TO_CHAR(SYSDATE,'YYYY-MM-DD HH24
		----------------------------------------------------------
		2004-02-07 15:44:48 下午 星期六



說明:該語句中的第一個參數表示要轉換的日期,第二個參數是格式字符串,表示轉換後的格式,結果類型爲字符串。“YYYY”爲4位的年 份,“MM”爲兩位的月份,“DD”爲兩位的日期,“HH24”表示顯示24小時制的小時,“MI”表示顯示分鐘,“SS”表示顯示秒,“AM”表示顯示 上午或下午(本例中爲下午),“DY”表示顯示星期。“-”、“:”和空格原樣顯示,用於分割日期和時間。轉換出來的系統時間爲:2004年2月7日(星 期六)下午15點44分48秒。
還可以按其他的格式顯示。以下查詢中插入中文的年月日,其中原樣顯示部分區別於外層的單引號,需要用雙引號引起。

將日期顯示轉換成中文的年月日。
輸入並執行查詢:

Sql代碼
  1. SELECT  TO_CHAR(sysdate, 'YYYY"年"MM"月"DD"日"' FROM  dual;  
SELECT TO_CHAR(sysdate,'YYYY"年"MM"月"DD"日"') FROM dual;


執行結果爲:

Sql代碼
  1. TO_CHAR(SYSDAT  
  2.         -------------------------   
  3.         2003年11月18日  
TO_CHAR(SYSDAT
		-------------------------
		2003年11月18日


說明:雙引號中的中文字“年”、“月”、“日”原樣顯示,單引號爲字符串的界定標記,區別於雙引號,不能混淆。

時間顯示的大小寫。
步驟1:執行以下查詢:

Sql代碼
  1. SELECT  SYSDATE,to_char(SYSDATE, 'yyyysp' FROM  dual;  
SELECT SYSDATE,to_char(SYSDATE,'yyyysp') FROM dual;


結果爲:

Sql代碼
  1. SYSDATE   TO_CHAR(SYSDATE, 'YYYYSP' )  
  2.         ------------- ----------------------------------------------   
  3.         07-2月 -04  two thousand four  
SYSDATE   TO_CHAR(SYSDATE,'YYYYSP')
		------------- ----------------------------------------------
		07-2月 -04  two thousand four


步驟2:執行以下查詢:

Sql代碼
  1. SELECT  to_char(SYSDATE, 'Yyyysp' FROM  dual;  
SELECT to_char(SYSDATE,'Yyyysp') FROM dual;


結果爲:

Sql代碼
  1. SYSDATE    TO_CHAR(SYSDATE, 'YYYYSP' )  
  2.         -------------- -----------------------------------------------   
  3.         Two Thousand Four  
SYSDATE    TO_CHAR(SYSDATE,'YYYYSP')
		-------------- -----------------------------------------------
		Two Thousand Four


數值轉換符:

9:代表一位數字,如果是正數,前面是空格,如果是負數,前面是−號,如:9999
0:代表一位數字,在相應的位置上如果沒有數字則出現0 0000
,:逗號,用作組分隔符,如:99,999
.:小數點,分隔整數和小數,如:999.9
$:$貨幣符號,如:$999.9
L:本地貨幣符號,如:L999.99
FM:去掉前後的空格,如:FM999.99
EEEE:科學計數法,如:9.9EEEE
S:負數符號−放在開頭,如:S999.9

將數值轉換成字符串並按新格式顯示。
執行以下查詢:

Sql代碼
  1. SELECT  TO_CHAR(sal, '$99,999' ) SALARY  FROM  emp  
  2.         WHERE  ename =  'SCOTT' ;  
SELECT TO_CHAR(sal,'$99,999') SALARY FROM emp
		WHERE ename = 'SCOTT';


結果爲:

Sql代碼
  1. SALARY  
  2.         ------------   
  3.          $4,000  
SALARY
		------------
 		 $4,000


說明:格式字符串中“$”表示轉換結果前面添加$。“9”表示一位數字,“99,999”表示結果可以顯示爲5位的數字。“,”表示在相應的位置上添加逗 號。如果實際數值位數不足5位,則只顯示實際位數,如4000實際位數爲4位,則只顯示4位。如果實際位數超過5位,則會填充爲#號。

其他函數
nvl:空值轉換函數,如:nvl(null, '空'),結果:空
decode:實現分支功能,如:decode(1,1, '男', 2, '女'),結果:男
userenv:返回環境信息,如:userenv('LANGUAGE'),結果:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
greatest:返回參數的最大值,如:greatest(20,35,18,9),結果:35
least:返回參數的最小值,如:least(20,35,18,9),結果:9

空值的轉換
如果對空值NULL不能很好的處理,就會在查詢中出現一些問題。在一個空值上進行算術運算的結果都是NULL。最典型的例子是,在查詢僱員表時,將工資sal字段和津貼字段comm進行相加,如果津貼爲空,則相加結果也爲空,這樣容易引起誤解。
使用nvl函數,可以轉換NULL爲實際值。該函數判斷字段的內容,如果不爲空,返回原值;爲空,則返回給定的值。

如下3個函數,分別用新內容代替字段的空值:
nvl(comm, 0):用0代替空的Comm值。
nvl(hiredate, '01-1月-97'):用1997年1月1日代替空的僱傭日期。
nvl(job, '無'):用“無”代替空的職務。
使用nvl函數轉換空值。
執行以下查詢:

Sql代碼
  1. SELECT   ename,nvl(job, '無' ),nvl(hiredate, '01-1月-97' ),nvl(comm,0)  FROM      emp;  
SELECT	ename,nvl(job,'無'),nvl(hiredate,'01-1月-97'),nvl(comm,0) FROM	 emp;


結果爲:

Sql代碼
  1. ENAME      NVL(JOB,'N NVL(HIREDA NVL(COMM,0)  
  2.         ---------------- ------------------- ------------------ -------------------   
  3.         SMITH      CLERK        17-12月-80            0  
  4.         ALLEN      SALESMAN    20-2月 -81          300  
ENAME      NVL(JOB,'N NVL(HIREDA NVL(COMM,0)
		---------------- ------------------- ------------------ -------------------
		SMITH      CLERK        17-12月-80            0
		ALLEN      SALESMAN    20-2月 -81          300


說明:本例中,空日期將顯示爲“01-1月-97”,空職務顯示爲“無”,空津貼將顯示爲0。

最大、最小值函數
greatest返回參數列表中的最大值,least返回參數列表中的最小值。
這兩個函數的參數是一個表達式列表,按表達式列表中的第一個表達式的類型對求值後的表達式求得最大或最小值。對字符的比較按ASCII碼的順序進行。如果表達式中有NULL,則返回NULL。

比較字符串的大小,返回最大值。
執行以下查詢:

Sql代碼
  1. SELECT   greatest( 'ABC' , 'ABD' , 'abc' 'abd' FROM  dual;  
SELECT	greatest('ABC','ABD','abc', 'abd') FROM dual;


執行結果爲:

Sql代碼
  1. GRE  
  2.         ------   
  3.         abd  
GRE
		------
		abd


說明:在上述四個字符串中,大小關係爲abd>abc>ABD>ABC。在ASCII碼錶中,排在後邊的字符大,小寫字母排在大寫字母之後。字符串的比較原則是,先比較第一位,如果相同,則繼續比較第二位,依此類推,直到出現大小關係。

原文地址:http://heisetoufa.javaeye.com/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章