Oracle数据类型转换

小编 2026-06-28 阅读:537 评论:0
oracle有三种最基本的数据类型,即字符型、数值型、日期型。同时提供类型转换函数 1)to_char     数值、日期->字符型     语法:to_char(num|date,[form...

oracle有三种最基本的数据类型,即字符型、数值型、日期型。同时提供类型转换函数

1)to_char

    数值、日期->字符型

   

语法:to_char(num|date,[format

mask],[nls_parameters])

    参数:num|date

待转换的数值或者日期

            format

mask:可选参数

 

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时,如果两者字符集不一样,则默认的转换方式是将数据编码从数据库字符集转换为国家字符集。

 

简单总结:

比较时,一般是字符型转换为数值型,字符型转换为日期型

算术运算时,一般把字符型转换为数值型,字符型转换为日期型

连接时(||),一般是把数值型转换为字符型,日期型转换为字符型

赋值、调用函数时,以定义的变量类型为准。

9:表示数字转字符的占位

0:表示占位符 及小数点后面有几位就是几个零

Oracle的转换函数实例展示

--自动类型转换
select 1+\'1\' from dual;

--前面是字符串,会自动转换成date类型
select add_months(\'1-7月-2017\',2) from dual;

--to_number   to_char   to_date
select sysdate from dual;
--把日期函数转换成字符串:to_char()
select sysdate,to_char(sysdate) from dual;

--自己定义日期的格式
select sysdate,to_char(sysdate,\'YYYY-MM-DD HH24:MI:ss\') from dual;
select sysdate,to_char(sysdate,\'YYYY-MM-DD\') from dual;
select sysdate,to_char(sysdate,\'HH24:MI:ss\') from dual;

--将数字转换成字符串:to_char
select 123,to_char(123) from dual;
--9代表占位符,如果位数少于前面的数字,都会显示#
--L代表本地货币符号
select 123,to_char(123,\'999\') from dual;

--to_date 将字符串转换成日期类型
select months_between(sysdate,\'2017-12-17\') from dual;
--to_date() 必须要指定日期的格式
select months_between(sysdate,to_date(\'2017-12-17\',\'YYYY-MM-DD\')) from dual;


--to_number 将字符串转数字  字符串必须只有数字
select \'123\',to_number(\'123.000\') from dual;

--nvl相当于java中的条件运算符      a?b:c
--查询所有员工的姓名,职位,薪水,提成和总工资
select ename,job,sal,comm,sal+comm income from emp;
select ename,job,sal,nvl(comm,o) comm,sal+nvl(comm,0) income from emp;

--nvl2:有三个参数,第一个参数为null,返回第三个参数的值,否则返回第二个
select ename,job,sal,comm,nvl2(comm,sal+comm,sal) income from emp;
--两者数据类型一定要一致
select comm,nvl(comm,\'无\') from;  --如果数据类型不一致,将出现报错现象。

--decode 功能类似 switch...case...
--查询所有员工的职位,并且以中文显示
select distinct job from emp;
select decode(job,\'CLERK\',\'职员\',\'SALESMAN\',\'销售员\',\'PRESIDENT\',\'不知道\',
\'MANAGER\',\'经理\',\'ANALYST\',\'分析师\') as job   from emp;

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
标签列表