oracle 類型轉換函數 & oracle 隱式轉換規則總結

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時,如果兩者字符集不一樣,則默認的轉換方式是將數據編碼從數據庫字符集轉換爲國家字符集。

 

簡單總結:

比較時,一般是字符型轉換爲數值型,字符型轉換爲日期型

算術運算時,一般把字符型轉換爲數值型,字符型轉換爲日期型

連接時(||),一般是把數值型轉換爲字符型,日期型轉換爲字符型

賦值、調用函數時,以定義的變量類型爲準。

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