Oracle 中的 to_date(), to_char(), to_number() 用途用法

在周末整理数据库的一些笔记时,发现自己对 to_date(); to_char(); to_number(); 这三个转换函数的写法格式不是很清楚,就用了一个下午对它们进行了一番研究。

以下 SQL 语句在本人的计算机上的 Oracle 数据库都进行了测试。欢迎参考研究!!!


一、to_date()

        看这个函数名就知道这是一个把什么东西转换为日期的函数。

        格式:to_date(被转换为日期的字符串或数字,格式);

我主要就是对括号中的两个参数进行了研究:

       先定义一下本文出现的 字段 含义:一个字段表示一个年或月或日或时或分或秒;完整日期就是六个字段。

       每个字段不能超过其最大值,比如月应该在 1~12,分钟在 0~60等,年不出现负数就行。

      当想要显示 24 小时制时,在格式的 hh 后面加上24

1.当该函数的第一个参数只有一个字段时,它可以是数字,也可以是数字字符串。但是, 这两个参数的字段个数一定要保持一致。

--前面只有一个字段(年或月或日)时,它可以是数字,或是数字字符
--格式中指定该字段为年时;输出指定年份的当前月的1号
--                  月时;输出当前年的指定月份的1号
--                  日时;输出当前年月的指定日
select to_date(12,'yyyy') from dual;--yyyy 时显示 0012,yy 时显示 2012,自动显示当前年份的前两位
select to_date(12,'mm') from dual;
select to_date(12,'dd') from dual;
select to_date('12' ,'yyyy') from dual;--指定月或日的同理
--格式中指定该字段为时时;输出当前年月的1号的指定时0分0秒
--                  分  ;输出当前年月的1号的 12时指定分0秒
--                  秒  ;                    12时0分指定秒
select to_date('12','hh') from dual;
select to_date('12','mi') from dual;
select to_date('12','ss') from dual;--前面是数字的例子没写了,同理

2. 当该函数的参数有多个字段时,第一个参数 必须用数字字符串

     参数中的字段之间的分隔不能用数字、单引号和字母,可以用英文状态下的任意特殊字符。如键盘上数字键上的那些字符及各种运算符、标点符号和双引号都可,空格也行

建议使用 - 和 / ,万一在一些复杂 SQL 语句中那些特殊字符有特殊意义或有歧义,导致出错。

下面写了一部分例子,有兴趣的朋友可以全部试试

--多个字段之间的分隔符多种多样,前后两个参数的分隔符可以不一致,但是字段的个数必须一致
--参数中两个字段举例如下,参数字段其他个数同理
--参数中未指定的字段如果是年或月或分或秒,则输出当下的相应字段
--      未指定            日或时,        则输出当下的1号或12时
select to_date('11"3','mm,dd') from dual;
select to_date('11!3','yyyy=dd') from dual;
select to_date('11<3','yyyy(mm') from dual;
select to_date('11%3','mi*ss') from dual;
select to_date('11@3','hh ss') from dual;
select to_date('11~3','hh`mi') from dual;

当我写出来的后,感觉自己研究的这些其实没多大用处啊。

咳咳,算了,自己开心就好


二、to_char()

           该函数是把相应的内容转换成字符

           格式:同样两个参数,前面是内容,后面是格式

前面参数可以是日期和数字,当然也可以是字符串,不过字符串转字符串是画蛇添足、多此一举

前面参数是数字时,格式可以是0或9,还可以是 $, L, 点和逗号

前面参数是日期时,需要先用 to_date 转换一下格式

--格式中只要有0时,位数更大,则前面补0;位数更小则显示相应位数+1个#(无L、$的情况下);位数相同则正常显示
select to_char(123456,'$000') from dual;
select to_char(123456,'990000099') from dual;
--格式中全为9时,位数更大,不补0;位数更小则显示相应位数+1个#(无L、$的情况下),位数相同正常显示
select to_char(123456,'999999999') from dual;

--日期可以用系统当前日期
--后面的格式的字段分隔符跟 to_date() 中的格式的字段分隔符差不多,但是这里不能用&。输出显示为相应的分隔符
--建议用 / 和 -,以为有歧义
select to_char(sysdate,'yyyy[mm/dd') from dual;
select to_char(sysdate,'yyyy%mm dd') from dual;
select to_char(sysdate,'mm/dd') from dual;--格式中指定什么,就输出对应的字段,不会有默认的字段

--想用指定日期时,需先用 to_date() 转换
--前后的格式可以不一样
select to_char(to_date('2020-3','yyyy,mm'),'yyyy/mm/dd') from dual;--这里输出2020/03/01
select to_char(to_date('2020-3','yyyy,mm'),'yyyy/mm') from dual;--这里输出2020/03
select to_char(to_date('2020-3','yyyy,mm'),'yyyy/m') from dual;--日期格式无法识别
select to_char(to_date('2020-3','yyyy,mm'),'yyyy/dd') from dual;--输出2020/01
select to_char(to_date('2020-3','mm-dd'),'yyyy/mm/dd') from dual;--无效的月份
select to_char(to_date('12-3','mm-dd'),'yyyy/mm/dd') from dual;--输出2017/12/03
select to_char(to_date('2020-3','yyyy,mm'),'yyyy/mm/d') from dual;--输出2020/03/1
select to_char(to_date('2020-3','yyyy,dd'),'yyyy/mm/dd') from dual;--输出2020/05/03
--to_char()中的格式表示月份必须写两个m,而表示天数则可以写一个,天数为个位数则不补0,但是天数为两位数输出错误结果
select to_char(to_date('2020-23','yyyy,dd'),'yyyy/mm/d') from dual;--输出2020/05/07,默认为当前的5月份,
                                                                   --但是天数不知是按什么规律显示的(今天是6号)
select to_char(to_date('2020-23','yyyy,dd'),'yyyy/mm/dd') from dual;--正常输出2020/05/23


三、 to_number()

          该函数把相应的内容转换成数字

          格式:同样两个参数,前面是内容,后面是格式

   前面的参数可以是数字,可以是数字字符串;后面的格式可以是0或9,还有 L,$,逗号,点

--后面参数的格式是都是9,位数必须大于等于前面参数的位数,多的不补0
select to_number('1234567','999999999999') from dual;
--后面参数的格式都是0,前后两个参数的位数只能相同
select to_number('12345','00000') from dual;
--后面参数的格式有0和9时,9开头则后面的位数可以大于等于前面参数的位数
--                        0开头则后面的位数只能等于前面参数的位数
select to_number('12345','9900909') from dual;
select to_number('12345','09009') from dual;



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值