Oracle 中的 to

xiaoxiao2021-02-28  56

在周末整理数据库的一些笔记时,发现自己对 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;

转载请注明原文地址: https://www.6miu.com/read-58277.html

最新回复(0)