一、数据转换类型
为数据库创建表时,SQL 程序员必须定义在表的各个字段中存储何种数据。在 SQL 中,有几种不同的数据类型。这些数据类型用于定义每个列中可以包含的值的范围。
(1)在本文中将使用以下数据类型
VARCHAR2CHAR
NUMBER
DATE
(2)数据类型
VARCHAR2:用于可变长度的字符数据,包括数字、特殊字符和短划线。
CHAR:用于固定长度的文本和字符数据,包括数字、短划线和特殊字符。
NUMBER:用于存储可变长度的数字数据。不能包含短划线、文本及其它非数字数据。货币存储为 NUMBER 数据类型。
DATE:用于日期和时间值。在内部,Oracle将日期存储为数字,默认情况下,DATE 信息的显示格式为 DD-MON-YY(如 19-JUN-04)。
(3)四种数据类型转换函数
Oracle Server 可以在内部将VARCHAR2 和 CHAR 数据转换为 NUMBER 和 DATE数据类型。它可以将 NUMBER和 DATE 数据转换回CHARACTER 数据类型。虽然这是一种方便的功能,但最好始终显式执行数据类型转换,以确保 SQL 语句可靠。
将学习以下四种数据类型转换函数:
• 将日期数据类型转换为字符数据类型• 将数字数据类型转换为字符数据类型
• 将字符数据类型转换为数字数据类型
• 将字符数据类型转换为日期数据类型
二、将日期数据转换为字符数据
(1)经常需要将以 DD-MON-YY 默认格式存储在数据库中的日期转换为用户指定的其它格式。
用来完成此任务的函数是:
TO_CHAR (日期列名, '指定的格式样式')• “格式样式”是区分大小写的,并且必须放在单引号内。
• 需要用逗号将日期值与“格式样式”隔开。
• 可以使用任何有效的日期格式元素。
• 可以使用 fm 元素从输出中删除填充的空格或删除前导零。
• 可以使用 sp 以文本形式显示数字。
• 可以使用 th 将数字显示为序数。(1st、2nd、3rd,依此类推)。
• 可以使用双引号将字符串添加到格式样式中。
(2)这些表显示了可以使用的各种格式样式。请注意,指定时间元素时,还可以设置小时 (HH)、分钟 (MI)、秒 (SS) 和 AM 或 PM 等格式。
(3)例如,以下查询将返回 May 04, 2004。如果某个活动的日期是 04-MAY-04,则使用 fm格式样式时将返回 May 4, 2004,即隐藏前导零。
SELECT TO_CHAR (活动日期, 'fmMonth dd, RRRR') FROM d_活动;
以下查询的输出结果是什么?SELECT 标识, TO_CHAR(活动日期, 'MONTH DD, YYYY') FROM d_活动;
(4)日期和时间格式样式
使用哪些格式样式可将今天的日期分别输出为以下格式?
August 6th, 2007August 06, 2007
AUG 6, 2007
August 6th, Friday, Two
Thousand Seven
三、将数字数据转换为 VARCHAR2 字符数据
(1)存储在数据库中的数字是不含格式的。
这意味着没有货币符号、逗号千位分隔符和小数,也没有其它格式。要添加格式,您需要先将数字转换为字符格式。在进行字符连接时此转换尤为有用。
用来将数字数据列转换为所需格式的 SQL 函数是:TO_CHAR(数字,'格式样式')
(2)此表介绍了可在TO_CHAR 函数中使用的几种格式元素。
SELECT TO_CHAR(费用,'$99,999') 费用 FROM d_活动
(3)使用哪些格式样式可以生成如下输出结果?
$3000.00
4,500
9,000.00
0004422
四、将字符数据转换为数字数据
(1)经常需要将字符串转换成数字。用来完成此转换的函数是:
TO_NUMBER(字符串, '格式样式')
此函数将非数字值(如‘450’)转换成数字,不带单引号。
单引号是字符。“450”在数据库中存储为字符数据,以下查询将其转换成数字,以便执行算术运算。无法对字符数据执行计算。
SELECT TO_NUMBER('450') AS "数字转换" FROM DUAL;
(2)SELECT TO_NUMBER('450', '9999') + 10 AS "数字转换" FROM DUAL;
SQL*Plus 会将超过格式样式指定位数的数字显示为一串井号 (#);还会将数字舍入到格式样式中提供的小数位。
如果格式样式与数据库返回的实际数字不匹配,OracleApplication Express 将返回“Oracle 错误 - 数字无效”。
五、将字符数据转换为日期数据
(1)要将字符串转换成日期格式,请使用以下格式:
TO_DATE('字符串', '格式样式')
此转换接受非日期值字符串(如“November 3, 2001”),并将其转换成日期值。格式样式告诉服务器该字符串“看起
来像”什么:
TO_DATE('November 3, 2001', 'Month dd, RRRR')
将返回 03-NOV-01
(2)在执行字符到日期的转换时,fx(格式完全匹配)限定符指定字符参数必须与日期格式样式完全匹配。
请注意,在下面的示例中,“May10”中的“May”和“10”之间没有空格。只有当 fx 格式样式中的“Mon”和“DD”之间也没有空格时,它才与字符参数相匹配。
SELECT TO_DATE('May10,1989', 'fxMonDD,RRRR') AS "转换" FROM DUAL;
(3)fx 限定符规则
fx 限定符规则如下:
• 字符参数中的标点和加引号文本必须与格式样式中的对应部分完全匹配(大小写除外)。
• 字符参数不能有额外的空格。不使用fx 时,Oracle Server 会忽略额外的空格。
• 字符参数中的数字数据必须与格式样式中的对应元素具有相同的位数。不使用fx 时,字符参数中的数字可省略前导零。
(4)RR 日期格式和 YY 日期格式
不久前,我们从 20 世纪(1900) 进入了 21 世纪(2000),这一变化带来了相当大的混乱。那就是,如果一个日期写为02-JAN-00,那么应当将其解释为 1900 年 1 月 2 日还是 2000 年 1 月 2 日?
幸运的是,Oracle 采用了适当的方式,可保证这类日期在存储和检索时都具备正确的世纪。
六、几个简单的规则
(1)如果指定日期格式时使用的是 YY 或 YYYY 格式,则返回的值在当前世纪中。所以,如果当前年份是 1995 而您使用的是 YY或 YYYY 格式,则一切正常,日期将在 20 世纪中。但是,如果当前年份是 2004,而您为 1989 之类的日期使用的是 YY 或YYYY格式,则返回的将是 2089!这可能不是您希望得到的结果。
(2)如果指定数据格式时使用的是 RR 或 RRRR 格式,则返回的值有两种可能。
如果当前年份介于 00 到49 之间,那么:
• 对于 0 到 49 之间的日期:日期将在当前世纪中
• 对于 50 到 99 之间的日期:日期将在上一个世纪中
如果当前年份介于 50 到 99 之间,那么:
• 对于 0 到 49 之间的日期:日期将在下一个世纪中• 对于 50 到 99 之间的日期:日期将在当前世纪中
(3)使用以下语句查询雇员数据库时,它返回了表中的所有行。我知道仅有一部分雇员是在 1990 年之前聘用的。我弄错了吗?
SELECT 姓氏, TO_CHAR(聘用日期,'DD-Mon-YYYY')
FROM 雇员
WHERE 聘用日期 <TO_DATE('01-Jan-90','DD-Mon-YY');
七、术语
本课中使用的主要术语包括:
CHAR
DATE
DD 日期格式
转换函数
fm
NUMBER
RR 日期格式
TO_CHAR
TO_DATE 函数
TO_NUMBER
VARCHAR2
八、小结
在本文中,应该已经学会:
• 为显式数据类型转换和隐式数据类型转换各举一个例子• 从企业角度说明,为什么一种语言有内置数据转换功能很重要
• 构建正确应用 TO_CHAR、TO_NUMBER 和 TO_DATE单行函数生成所需结果的 SQL 查询
• 应用适当的日期和(或)字符格式样式来生成所需的输出
• 解释 YYYY 和 RRRR 的用法,并应用 YYYY 和 RRRR正确返回存储在数据库中的年份