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'这样混用,却不曾想这里面另有蹊 ...
随机推荐
- HDU 5884 Sort(二分+优先队列)
http://acm.hdu.edu.cn/showproblem.php?pid=5884 题意:有个屌丝设计了一个程序,每次可以将k个数组进行合并,代价为这k个数组总的长度之和.现在另外一个屌丝要 ...
- TypeScript 小记
1. 对比JavaScript TypeScript是JavaScript的超集,可编译为JavaScript,主要提供类型系统等增强代码的可读性和可维护性,适合中大型项目多人协作: TypeScri ...
- 正则表达式中 (?=pattern) (?!pattern) (?<=pattern) (?<!pattern) 的使用
2018-08-06 12:33:58 StackOverFlow上有个如下的问题: 这里就会用到正向肯定预查(?=pattern):
- TestNG 101
最近看了点TestNG,做个入门笔记 0.Maven + TestNG 0a. 创建Maven 项目,pom中添加依赖(可能还需要安装TestNG插件 <dependencies> < ...
- 敏感性、特异性、假阳性、假阴性(sensitivity and specificity)
医学.机器学习等等,在统计结果时时长会用到这两个指标来说明数据的特性. 定义 敏感性:在金标准判断有病(阳性)人群中,检测出阳性的几率.真阳性.(检测出确实有病的能力) 特异性:在金标准判断无病(阴性 ...
- (转)TeamViewer三种许可证的区别是什么?
xu言: 这几天在使用teamview对它的许可证做了一些了解,看到这个好像是官方的写的挺不错.留作收藏 PS:https://www.uret.in/ 顺便也发现了一个不错的网站 很多想要购买Te ...
- 20170728xlVba SSC_LastTwoDays
Public Sub SSCLastTwoDays() Dim strText As String Dim Reg As Object, Mh As Object, OneMh As Object D ...
- python-day20--collections模块
1.namedtuple: 生成可以使用名字来访问元素内容的tuple >>> from collections import namedtuple >>> Poi ...
- hdu1180 优先队列bfs+判断方向
诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Subm ...
- Razor视图引擎 语法学习
下面就和大家分享下我在asp.net官网看到的资料,学习到的点语法.1.通过使用@符号,可以直接在html页面中写C#或者VB代码:运行后: 2.页面中的C#或者VB代码都放在大括号中.运行后: 3. ...