Oracle入门(十四C)之转换函数
一、數(shù)據(jù)轉(zhuǎn)換類型
為數(shù)據(jù)庫創(chuàng)建表時(shí),SQL 程序員必須定義在表的各個(gè)字段中存儲(chǔ)何種數(shù)據(jù)。在 SQL 中,有幾種不同的數(shù)據(jù)類型。這些數(shù)據(jù)類型用于定義每個(gè)列中可以包含的值的范圍。
(1)在本文中將使用以下數(shù)據(jù)類型
VARCHAR2CHAR
NUMBER
DATE
(2)數(shù)據(jù)類型
VARCHAR2:用于可變長度的字符數(shù)據(jù),包括數(shù)字、特殊字符和短劃線。
CHAR:用于固定長度的文本和字符數(shù)據(jù),包括數(shù)字、短劃線和特殊字符。
NUMBER:用于存儲(chǔ)可變長度的數(shù)字?jǐn)?shù)據(jù)。不能包含短劃線、文本及其它非數(shù)字?jǐn)?shù)據(jù)。貨幣存儲(chǔ)為 NUMBER 數(shù)據(jù)類型。
DATE:用于日期和時(shí)間值。在內(nèi)部,Oracle將日期存儲(chǔ)為數(shù)字,默認(rèn)情況下,DATE 信息的顯示格式為 DD-MON-YY(如 19-JUN-04)。
(3)四種數(shù)據(jù)類型轉(zhuǎn)換函數(shù)
Oracle Server 可以在內(nèi)部將VARCHAR2 和 CHAR 數(shù)據(jù)轉(zhuǎn)換為 NUMBER 和 DATE數(shù)據(jù)類型。它可以將 NUMBER和 DATE 數(shù)據(jù)轉(zhuǎn)換回CHARACTER 數(shù)據(jù)類型。雖然這是一種方便的功能,但最好始終顯式執(zhí)行數(shù)據(jù)類型轉(zhuǎn)換,以確保 SQL 語句可靠。
將學(xué)習(xí)以下四種數(shù)據(jù)類型轉(zhuǎn)換函數(shù):
? 將日期數(shù)據(jù)類型轉(zhuǎn)換為字符數(shù)據(jù)類型? 將數(shù)字?jǐn)?shù)據(jù)類型轉(zhuǎn)換為字符數(shù)據(jù)類型
? 將字符數(shù)據(jù)類型轉(zhuǎn)換為數(shù)字?jǐn)?shù)據(jù)類型
? 將字符數(shù)據(jù)類型轉(zhuǎn)換為日期數(shù)據(jù)類型
二、將日期數(shù)據(jù)轉(zhuǎn)換為字符數(shù)據(jù)
(1)經(jīng)常需要將以 DD-MON-YY 默認(rèn)格式存儲(chǔ)在數(shù)據(jù)庫中的日期轉(zhuǎn)換為用戶指定的其它格式。
用來完成此任務(wù)的函數(shù)是:
TO_CHAR (日期列名, '指定的格式樣式')? “格式樣式”是區(qū)分大小寫的,并且必須放在單引號(hào)內(nèi)。
? 需要用逗號(hào)將日期值與“格式樣式”隔開。
? 可以使用任何有效的日期格式元素。
? 可以使用 fm 元素從輸出中刪除填充的空格或刪除前導(dǎo)零。
? 可以使用 sp 以文本形式顯示數(shù)字。
? 可以使用 th 將數(shù)字顯示為序數(shù)。(1st、2nd、3rd,依此類推)。
? 可以使用雙引號(hào)將字符串添加到格式樣式中。
(2)這些表顯示了可以使用的各種格式樣式。請注意,指定時(shí)間元素時(shí),還可以設(shè)置小時(shí) (HH)、分鐘 (MI)、秒 (SS) 和 AM 或 PM 等格式。
(3)例如,以下查詢將返回 May 04, 2004。如果某個(gè)活動(dòng)的日期是 04-MAY-04,則使用 fm格式樣式時(shí)將返回 May 4, 2004,即隱藏前導(dǎo)零。
SELECT TO_CHAR (活動(dòng)日期, 'fmMonth dd, RRRR')? FROM d_活動(dòng);
以下查詢的輸出結(jié)果是什么?SELECT 標(biāo)識(shí), TO_CHAR(活動(dòng)日期, 'MONTH DD, YYYY')? FROM d_活動(dòng);
(4)日期和時(shí)間格式樣式
使用哪些格式樣式可將今天的日期分別輸出為以下格式?
August 6th, 2007August 06, 2007
AUG 6, 2007
August 6th, Friday, Two
Thousand Seven
三、將數(shù)字?jǐn)?shù)據(jù)轉(zhuǎn)換為 VARCHAR2 字符數(shù)據(jù)
(1)存儲(chǔ)在數(shù)據(jù)庫中的數(shù)字是不含格式的。
這意味著沒有貨幣符號(hào)、逗號(hào)千位分隔符和小數(shù),也沒有其它格式。要添加格式,您需要先將數(shù)字轉(zhuǎn)換為字符格式。在進(jìn)行字符連接時(shí)此轉(zhuǎn)換尤為有用。
用來將數(shù)字?jǐn)?shù)據(jù)列轉(zhuǎn)換為所需格式的 SQL 函數(shù)是:TO_CHAR(數(shù)字,'格式樣式')
(2)此表介紹了可在TO_CHAR 函數(shù)中使用的幾種格式元素。
SELECT TO_CHAR(費(fèi)用,'$99,999') 費(fèi)用? FROM d_活動(dòng)
(3)使用哪些格式樣式可以生成如下輸出結(jié)果?
$3000.00
4,500
9,000.00
0004422
四、將字符數(shù)據(jù)轉(zhuǎn)換為數(shù)字?jǐn)?shù)據(jù)
(1)經(jīng)常需要將字符串轉(zhuǎn)換成數(shù)字。用來完成此轉(zhuǎn)換的函數(shù)是:
TO_NUMBER(字符串, '格式樣式')
此函數(shù)將非數(shù)字值(如‘450’)轉(zhuǎn)換成數(shù)字,不帶單引號(hào)。
單引號(hào)是字符。“450”在數(shù)據(jù)庫中存儲(chǔ)為字符數(shù)據(jù),以下查詢將其轉(zhuǎn)換成數(shù)字,以便執(zhí)行算術(shù)運(yùn)算。無法對(duì)字符數(shù)據(jù)執(zhí)行計(jì)算。
SELECT TO_NUMBER('450') AS "數(shù)字轉(zhuǎn)換"? FROM DUAL;
(2)SELECT TO_NUMBER('450', '9999') + 10 AS "數(shù)字轉(zhuǎn)換" FROM DUAL;
SQL*Plus 會(huì)將超過格式樣式指定位數(shù)的數(shù)字顯示為一串井號(hào) (#);還會(huì)將數(shù)字舍入到格式樣式中提供的小數(shù)位。
如果格式樣式與數(shù)據(jù)庫返回的實(shí)際數(shù)字不匹配,OracleApplication Express 將返回“Oracle 錯(cuò)誤 - 數(shù)字無效”。
五、將字符數(shù)據(jù)轉(zhuǎn)換為日期數(shù)據(jù)
(1)要將字符串轉(zhuǎn)換成日期格式,請使用以下格式:
TO_DATE('字符串', '格式樣式')
此轉(zhuǎn)換接受非日期值字符串(如“November 3, 2001”),并將其轉(zhuǎn)換成日期值。格式樣式告訴服務(wù)器該字符串“看起
來像”什么:
TO_DATE('November 3, 2001', 'Month dd, RRRR')
將返回 03-NOV-01
(2)在執(zhí)行字符到日期的轉(zhuǎn)換時(shí),fx(格式完全匹配)限定符指定字符參數(shù)必須與日期格式樣式完全匹配。
請注意,在下面的示例中,“May10”中的“May”和“10”之間沒有空格。只有當(dāng) fx 格式樣式中的“Mon”和“DD”之間也沒有空格時(shí),它才與字符參數(shù)相匹配。
SELECT TO_DATE('May10,1989', 'fxMonDD,RRRR') AS "轉(zhuǎn)換"? FROM DUAL;
(3)fx 限定符規(guī)則
fx 限定符規(guī)則如下:
? 字符參數(shù)中的標(biāo)點(diǎn)和加引號(hào)文本必須與格式樣式中的對(duì)應(yīng)部分完全匹配(大小寫除外)。
? 字符參數(shù)不能有額外的空格。不使用fx 時(shí),Oracle Server 會(huì)忽略額外的空格。
? 字符參數(shù)中的數(shù)字?jǐn)?shù)據(jù)必須與格式樣式中的對(duì)應(yīng)元素具有相同的位數(shù)。不使用fx 時(shí),字符參數(shù)中的數(shù)字可省略前導(dǎo)零。
(4)RR 日期格式和 YY 日期格式
不久前,我們從 20 世紀(jì)(1900) 進(jìn)入了 21 世紀(jì)(2000),這一變化帶來了相當(dāng)大的混亂。那就是,如果一個(gè)日期寫為02-JAN-00,那么應(yīng)當(dāng)將其解釋為 1900 年 1 月 2 日還是 2000 年 1 月 2 日?
幸運(yùn)的是,Oracle 采用了適當(dāng)?shù)姆绞?#xff0c;可保證這類日期在存儲(chǔ)和檢索時(shí)都具備正確的世紀(jì)。
六、幾個(gè)簡單的規(guī)則
(1)如果指定日期格式時(shí)使用的是 YY 或 YYYY 格式,則返回的值在當(dāng)前世紀(jì)中。所以,如果當(dāng)前年份是 1995 而您使用的是 YY或 YYYY 格式,則一切正常,日期將在 20 世紀(jì)中。但是,如果當(dāng)前年份是 2004,而您為 1989 之類的日期使用的是 YY 或YYYY格式,則返回的將是 2089!這可能不是您希望得到的結(jié)果。
(2)如果指定數(shù)據(jù)格式時(shí)使用的是 RR 或 RRRR 格式,則返回的值有兩種可能。
如果當(dāng)前年份介于 00 到49 之間,那么:
? 對(duì)于 0 到 49 之間的日期:日期將在當(dāng)前世紀(jì)中
? 對(duì)于 50 到 99 之間的日期:日期將在上一個(gè)世紀(jì)中
如果當(dāng)前年份介于 50 到 99 之間,那么:
? 對(duì)于 0 到 49 之間的日期:日期將在下一個(gè)世紀(jì)中? 對(duì)于 50 到 99 之間的日期:日期將在當(dāng)前世紀(jì)中
(3)使用以下語句查詢雇員數(shù)據(jù)庫時(shí),它返回了表中的所有行。我知道僅有一部分雇員是在 1990 年之前聘用的。我弄錯(cuò)了嗎?
SELECT 姓氏, TO_CHAR(聘用日期,'DD-Mon-YYYY')??
FROM 雇員??
WHERE 聘用日期 <TO_DATE('01-Jan-90','DD-Mon-YY');
七、術(shù)語
本課中使用的主要術(shù)語包括:
CHAR
DATE
DD 日期格式
轉(zhuǎn)換函數(shù)
fm
NUMBER
RR 日期格式
TO_CHAR
TO_DATE 函數(shù)
TO_NUMBER
VARCHAR2
八、小結(jié)
在本文中,應(yīng)該已經(jīng)學(xué)會(huì):
? 為顯式數(shù)據(jù)類型轉(zhuǎn)換和隱式數(shù)據(jù)類型轉(zhuǎn)換各舉一個(gè)例子? 從企業(yè)角度說明,為什么一種語言有內(nèi)置數(shù)據(jù)轉(zhuǎn)換功能很重要
? 構(gòu)建正確應(yīng)用 TO_CHAR、TO_NUMBER 和 TO_DATE單行函數(shù)生成所需結(jié)果的 SQL 查詢
? 應(yīng)用適當(dāng)?shù)娜掌诤?#xff08;或)字符格式樣式來生成所需的輸出
? 解釋 YYYY 和 RRRR 的用法,并應(yīng)用 YYYY 和 RRRR正確返回存儲(chǔ)在數(shù)據(jù)庫中的年份
總結(jié)
以上是生活随笔為你收集整理的Oracle入门(十四C)之转换函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 匡正是什么意思 匡正的意思
- 下一篇: Oracle入门(十四D)之常规函数