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');
6) 用连接操作符(||)时,oracle会把非字符类型的数据转换为字符类型。
select 1||'2' from dual; -> select to_char(1)||'2' from dual;
7) 如果字符类型的数据和非字符类型的数据(如number、date、rowid等)作算术运算,则oracle会将字符类型的数据转换为合适的数据类型,这些数据类型可能是number、date、rowid等。
如果CHAR/VARCHAR2 和NCHAR/NVARCHAR2之间作算术运算,
则oracle会将她们都转换为number类型的数据再做比较。
8) 比较CHAR/VARCHAR2 和NCHAR/NVARCHAR2时,如果两者字符集不一样,则默认的转换方式是将数据编码从数据库字符集转换为国家字符集。
简单总结:
比较时,一般是字符型转换为数值型,字符型转换为日期型
算术运算时,一般把字符型转换为数值型,字符型转换为日期型
连接时(||),一般是把数值型转换为字符型,日期型转换为字符型
赋值、调用函数时,以定义的变量类型为准。
oracle数据类型及其隐式转换的更多相关文章
- ORACLE绑定变量隐式转换导致性能问题
年后一次系统升级后,监控数据库的工具DPA发现数据库的Total Wait时间突然飙增,如下截图所示,数据库的总体等待时间对比升级前飙增了非常多 另外就是发现出现了较多的等待事件,主要有latch: ...
- javascript笔记整理(数据类型强制/隐式转换 )
A.数据类型强制转换 1.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 var a=false;alert(Number(a)); ...
- JavaScript的六种数据类型与隐式转换
一.六种数据类型 javascript的数据类型包括: (1)基本数据类型:number.string.boolean.null.undefined (2)对象:object object又包括Fun ...
- 数据类型,隐式转换以及json,对象,引用类型,预解析 视频教程
随便看看,需要有一点一点基础. 链接:http://pan.baidu.com/s/1c20pcOC 密码:xq2x
- javascript深入浅出——学习笔记(六种数据类型和隐式转换)
在慕课之前学过JS深入浅出,最近发现很多东西都记不太清楚了,再复习一遍好了,感觉这个课程真的超级棒的,做做笔记,再添加一些学习内容
- 关于ORACLE隐式转换后性能问题
SELECT TM.MONEY_CODE FROM T_CONTRACT_MASTER T,T_MONEY TM WHERE T.MONEY_ID = TM.MONEY_ID AND T.POLICY ...
- SQL Server有意思的数据类型隐式转换问题
写这篇文章的时候,还真不知道如何取名,也不知道这个该如何将其归类.这个是同事遇到的一个案例,案例比较复杂,这里抽丝剥茧,仅仅构造一个简单的案例来展现一下这个问题.我们先构造测试数据,如下所示: CRE ...
- js中的数据类型隐式转换的三种情况
js的数据类型隐式转换主要分为三种情况: 1. 转换为boolean类型 2. 转换为number类型 3. 转换为string类型 转换为boolean类型 数据在 逻辑判断 和 逻辑运算 之中会隐 ...
- Oracle数据类型隐式转换小析
测试使用环境:oracle 11g r1 平常写sql语句时,大大咧咧,不太注意和数字有关的数据类型,有时例如 where c1=111 和 where c1='111'这样混用,却不曾想这里面另有蹊 ...
随机推荐
- MapReduce程序(一)——wordCount
写在前面:WordCount的功能是统计输入文件中每个单词出现的次数.基本解决思路就是将文本内容切分成单词,将其中相同的单词聚集在一起,统计其数量作为该单词的出现次数输出. 1.MapReduce之w ...
- DataTables warning: table id=data-table - Requested unknown parameter '3' for row 0.
本文为博主原创,未经允许,不得转载: 在使用jquery 的datatable时,报错在页面弹出弹出框,并提示以下内容: DataTables warning: table id=data-table ...
- 在Windows上面使用QT5 (without QTcreator or VS 2017)
在Windows上面使用QT5 (without QTcreator or VS 2017) 本文环境: 最新版 QT 5.12.1 Windows 10 64位 仅考虑动态链接,静态链接不在本文讨论 ...
- Linux(CentOS 6.5) 下安装MySql 5.7.18 二进制版本粗浅攻略
鉴于Linux和mysql因不同版本,安装方式也不同,所以在阅读本攻略前,请确保各位同学的版本和我的Linux.MySql 版本一致. 如果不一致,只能参考. 我的版本: Linux CentOS 6 ...
- preg_match
$baseUrl = request()->baseUrl(); if (!preg_match('/admin.php/',$baseUrl)) { $this->redirect('/ ...
- jsp session/application
session的增加读取 session.setAttribute("username", "张三"); String u = (String) session ...
- WPF样式——经典博客
WPF样式博客:http://www.cnblogs.com/luluping/archive/2011/05/06/2039498.html
- English trip -- Phonics 6 元音字母 u + Unit 5 B课 review
Vowel u [ʌ] 闭音节 bunny cut bug mushroom lunch ar er ur or ir = R (读音类似儿) e.g. dollar 美元 collar n. ...
- 河南省第十一届ACM大学生程序设计竞赛
nyoj-1365-山区修路 内存限制:128MB 时间限制:3000ms 特判: No通过数:4 提交数:4 难度:3 题目描述: SNJ位于HB省西部一片群峰耸立的高大山地,横亘于A江.B水之间, ...
- Android 时钟(由秒转变为时分秒)
int second = 0: Handler handler = new Handler(); handler.post(runnable); Runnable runnable = new Run ...