oracle有三種最基本的數據類型,即字符型、數值型、日期型。
oracle提供的單行函數中,針對不同的數據類型,提供大量實用的函數,同時提供一系列數據類型轉換函數。
相信這些函數,在進行數據庫的操作過程中,都大量的被使用過。。
1)to_char
數值、日期->字符型
語法:to_char(num|date,[format mask],[nls_parameters])
參數:num|date 待轉換的數值或者日期
format mask:可選參數
數字->字符型的可用格式
格式元素 |
元素說明 |
格式 |
數字 |
字符結果 |
9 |
數字寬度 |
9999 |
12 |
12 |
0 |
顯示前面的零 |
09999 |
0012 |
00012 |
. |
小數點的位置 |
09999.999 |
030.40 |
00030.400 |
D |
小數點分隔符的位置(默認爲句點) |
09999D999 |
030.40 |
00030.400 |
, |
逗號的位置 |
09999,999 |
03040 |
00003,040 |
G |
組分隔符的位置(默認爲逗號) |
09999G999 |
03040 |
00003,040 |
$ |
美元符號 |
$099999 |
03040 |
$003040 |
L |
當地貨幣 |
L099999 |
03040 |
GBP003040如果nls_currency設置爲GBP |
MI |
表示負數的減號的位置 |
99999MI |
-3040 |
3040- |
PR |
包圍在括號內的負數 |
99999PR |
-3040 |
<3040> |
EEEE |
科學計數法 |
99.99999EEEE |
121.976 |
1.21976E+02 |
U |
Nls_dual_currency |
U099999 |
03040 |
CAD003040如果nls_dual_currency設置爲CAD |
V |
乘以10n次(n是V之後9的數量) |
9999V99 |
3040 |
304000 |
S |
前面加上+或者- |
S999999 |
3040 |
+3040 |
日期->字符型的可用格式(示例日期:02-JUN-1975)
格式說明 |
說明 |
結果 |
Y |
年的最後一位 |
5 |
YY |
年的最後兩位 |
75 |
YYY |
年的最後三位 |
975 |
YYYY |
四位數字表示的年 |
1975 |
RR |
兩位數字表示的年 |
75 |
YEAR |
區別大小寫並用英語拼寫的年 |
NINETEEN SEVENTY-FIVE |
MM |
兩位數表示的月 |
06 |
MON |
月的三個字母縮寫 |
JUN |
MONTH |
區分大小寫並用英語拼寫的月 |
JUNE |
D |
星期幾 |
2 |
DD |
月的兩位數日(即是本月的第幾天) |
02 |
DDD |
年的日 |
153 |
DY |
星期的三個字母縮寫 |
MON |
DAY |
區分大小寫並用英語拼寫的星期 |
MONDAY |
其他不常用的格式掩碼
演示數據:24-SEP-1000 BC
格式元素 |
說明 |
結果 |
W |
月的週數 |
4 |
WW |
年的週數 |
39 |
Q |
年的季度 |
3 |
CC |
世紀 |
10 |
S preceding CC,YYYY,YEAR |
如果日期是BC,那麼減號就在結果之前 |
-10,-1000或者-ONE THOUSAND |
IYYY,IYY,IY,I |
分別表示4,3,2,1爲ISO日期 |
1000,000,00,0 |
BC,AD,B.C. and A.D. |
|
|
J |
儒略日—從公元前4713年12月31日開始的天數 |
1356075 |
IW |
ISO標準周(1到53) |
39 |
RM |
用羅馬數字表示的月 |
IX |
時間組件的日期格式掩碼
演示數據:27-JUN-2010 21:35:13
格式元素 |
說明 |
結果 |
AM,PM,A.M.和P.M. |
子午線指示器 |
PM |
HH,HH12,HH24 |
一天的小時,1-12時和0-23時 |
09,09,21 |
MI |
分(0-59) |
35 |
SS |
秒(0-59) |
12 |
SSSSS |
午夜之後的秒(0-86399) |
77713 |
其他日期格式掩碼
格式元素 |
說明和格式掩碼 |
結果 |
-/.,?#! |
標點符號:’MM.YY’ |
09.08 |
“any character literal” |
字符值:’”Week” W “”of” Month’ |
Week 2 of September |
TH |
位置或者序數文本:’DDth”of”Month’ |
12TH of September |
SP |
拼寫出數字:’MmSP Month YYYYSP’ |
Nine September Two Thousand Eight |
THSP or SPTH |
拼寫出位置或者序數:’hh24SpTh’ |
Fourteenth |
2)to_date
字符值->日期值
語法:to_date (string,[format mask],[nls_parameters])
參數:string 待轉換的字符值
format mask:可選參數
格式掩碼同to_char轉換爲date時相同。
備註:轉換時要根據給定的string設定正確的格式掩碼,否則
Ora_01840:input value is not long enough for date format.
Ora_01862:the numeric value does not match the length of the format item.
3) to_number
字符值->數字值
語法:to_number (string,[format mask],[nls_parameters])
參數:string 待轉換的字符值
format mask:可選參數
格式掩碼同to_char轉換爲number時相同。
備註:如果使用較短的格式掩碼就會返回錯誤。
例如: to_number(123.56,’999.9’)返回錯誤。
在oracle中,如果不同的數據類型之間關聯,如果不顯式轉換數據,則它會根據以下規則對數據進行隱式轉換
1) 對於INSERT和UPDATE操作,oracle會把插入值或者更新值隱式轉換爲字段的數據類型。
假如id列的數據類型爲number
update t set id='1'; -> 相當於 update t set id=to_number('1');
insert into t(id) values('1') -> insert into t values(to_number('1'));
2) 對於SELECT語句,oracle會把字段的數據類型隱式轉換爲變量的數據類型。
如假設id列的數據類型爲varchar2
select * from t where id=1; -> select * from t where to_number(id)=1;
但如果id列的數據類型爲number,則
select * from t where id='1'; -> select * from t where id=to_number('1');(參考下文)
3) 當比較一個字符型和數值型的值時,oracle會把字符型的值隱式轉換爲數值型。
如假設id列的數據類型爲number
select * from t where id='1'; -> select * from t where id=to_number('1');
4) 當比較字符型和日期型的數據時,oracle會把字符型轉換爲日期型。
如假設create_date爲字符型,
select * from t where create_date>sysdate; -> select * from t where to_date(create_date)>sysdate;(注意,此時session的nls_date_format需要與字符串格式相符)
假設create_date爲date型,
select * from t where create_date>'2006-11-11 11:11:11'; -> select * from t where create_date>to_date('2006-11-11 11:11:11'); (注意,此時session的nls_date_format需要與字符串格式相符)
5) 如果調用函數或過程等時,如果輸入參數的數據類型與函數或者過程定義的參數數據類型不一直,則oracle會把輸入參數的數據類型轉換爲函數或者過程定義的數據類型。
如假設過程如下定義 p(p_1 number)
exec p('1'); -> exec p(to_number('1')); 6)
賦值時,oracle會把等號右邊的數據類型轉換爲左邊的數據類型。
如 var a number a:='1'; - > a:=to_number('1');
7) 用連接操作符(||)時,oracle會把非字符類型的數據轉換爲字符類型。
select 1||'2' from dual; -> select to_char(1)||'2' from dual;
8) 如果字符類型的數據和非字符類型的數據(如number、date、rowid等)作算術運算,則oracle會將字符類型的數據轉換爲合適的數據類型,這些數據類型可能是number、date、rowid等。
如果CHAR/VARCHAR2 和NCHAR/NVARCHAR2之間作算術運算,
則oracle會將她們都轉換爲number類型的數據再做比較。
9) 比較CHAR/VARCHAR2 和NCHAR/NVARCHAR2時,如果兩者字符集不一樣,則默認的轉換方式是將數據編碼從數據庫字符集轉換爲國家字符集。
簡單總結:
比較時,一般是字符型轉換爲數值型,字符型轉換爲日期型
算術運算時,一般把字符型轉換爲數值型,字符型轉換爲日期型
連接時(||),一般是把數值型轉換爲字符型,日期型轉換爲字符型
賦值、調用函數時,以定義的變量類型爲準。