1.TO_CHAR()--转换成字符串类型数据
UpdateTime--2017年6月20日10:46:05
1.1 TO_CHAR(NUMBER)
用途:本函数把参数N转为一个VARCHAR2类型的数值。N可以是NUMBER,BINARY_FLOAT,或者BINARY_DOUBLE;如果不带格式,那么函数会把N转换为足以表示N的VARCHAR2字符串。
格式表参考:
格式 | 简例 | 举例 | 说明 |
, (逗号) | '99,999' | select to_char(1000,'9,999') from dual --1,000 | 逗号,一般以千分位出现,作为分组符号使用.如果需要您也可以当作是十分位,百分位出现,可以出现N次,视乎数字的大小而定. 变态的例子是 to_char(1234,'9,9,9,9'). 注意事项:只能出现在整数部分 |
. (点号) | '99.99' | select to_char(1234.34,'9,9,9,9.99') from dual --1,2,3,4.34 | 点号,不要念为"句号",句号是个圆圈,点号只能出现在小数点对应的地方,只能出现一次. 注意事项:只能出现在一个地方,就是原来数据小数点位置 |
$ (美元符号) | '$999.99' | select to_char(1234.34,'9,999.$99') from dual --$1,234.34 | 美元,可以放在任意地方 注意事项:只能出现一次 |
0(零) | '0999.99' | select to_char(1234,'9,999.00') from dual -- 1,234.00 | 零.在对应位置返回对应的字符,如果没有则以'0'填充 注意事项:这是一个强制的符号,对应位没有,则以'o'填充,这是9很大不同地方 |
9 | '999.99' | select to_char(123,'99999.99') from dual --123.00 | 9.在小数位,则表示转换为对应字符,如果没有则以0表示;在整数位,没有对应则不填充字符 注意事项:对于0和9而言,如果格式的位数<数字的位数,会返回'#'. |
B(空格符) | 'B999' | select 'S'||TO_CHAR(1234,'99B99') from dual --S 1234 | 没有其它特别作用,在整数部分最前面加一个空格,可以出现在任意位置 注意事项:只能出现在整数部位 |
C(国际货币符号) | 'C9999' | | 在特定的位置返回一个ISO货币符号(就是NLS_ISO_CURRENCY参数所代表的值) TO_CHAR(1233,'C9999')='CNY1234' ,这是新的国际标准RMB,关于这个可查询"国际货币符号" 注意事项:只能出现在整数部位第一位. 可以通过alter session set NLS_ISO_CURRENCY='JAPAN';来修改当前会话的设置. |
D(ISO 小数位符号) | '999D99' | | 这是"点号"的国际版本(ISO),作用等同于点号,也是只能出现一次.所不同的是,数据库会根据NLS_NUMERIC_CHARACTER的参数值来设置内容.默认的这个值是点号. 注意事项:没有特别需要一般不要用这个格式符号.也不要轻易修改参数值. 也可用alter sesssion set 来修改. alter session set nls_numeric_characters='!,'; to_char(1234.34,'9999d99')=1234!34 |
EEEE(科学计算符) | 9.9EEEE | | 科学计算符号 TO_CHAR(2008032001,'9.9EEEE')='2.01E+09',由于是科学计算方法,所以小数位前面加一个9或者0即可,多个是没有意义的. |
G(分组符号) | 999G999 | | 是逗号(,)的的ISO标准,作为分组符号使用,可以放在多个地方使用. TO_CHAR(123456,'999G9G99')=123,4,56 注意事项:同第八项 -D, 此外如果要转换出小数点,则要和D配合使用,不能和点号配合. |
L(本地货币符号) | 'L999' | | 是C的本地版本.可以放在整个格式的最前面和最后面. TO_CHAR(123456,'999G9G99D00L')=123,4,56.00¥ 注意事项:同第七项 C |
MI(负号) | '9999MI' | | 如果是负数,在尾部加上负号(-),如果是正数,则尾巴加上空格 to_char(1234,'9999mi')||'S'||TO_CHAR(-5678,'9999MI') =1234 S5678- 注意事项:只能放在格式尾巴 |
PR(符号) | 9999PR | | 是表达负数的另外一种方式.如果是正数,则头部加上空格;如果是负数,则用小简括号<>把数字包起来. TO_CHAR(-1234.89,'9G999D00PR')=<1,234.89> 注意事项:同12 |
S | '9999S' | select to_char(1234,'S9999') from dual --+1234 | 是12,13的综合改进版本.为整数加一个正号+,为负数加一个符号-.S在前则加在前,在后则在后 |
X | XXXX | select to_char(100,'XX') from dual --64 | 转换为16进制 注意事项:数值必须是大于等于0的整数。前面只能和0或者FM组合使用 |
其他数字转字符串的格式,由于不常用没有罗列,详细见上面网址
小结:
数值类: 0,9,
分组类: (.),(,),D,G ,其中点好和逗号因为表示不明显,所以用小括号凸显。
货币类: $,C,L,U
计算转换类:EEEE,RN,V,X
正负符号:MI,PR,S
其它类:B
正统类:TM
1.2 TO_CHAR(CHARACTER)
用途:把NCLOB,CLOB,NCHAR转换为VARCHAR2
1.3 TO_CHAR(DATETIME)
用途:把日期转化为字符串
UpdateTime--2017年7月5日08:10:02
格式 | 举例 | 说明 |
- / , . ; : "text" | SELECT TO_CHAR(sysdate,'yyyy"年"MM"月"dd"日"') FROM DUAL --2017年06月21日 | 时间分隔符号,除了标准的几个,还允许用文字作为分割符号 |
AD A.D. | 不会举例 | 即拉丁文Anno Domini的简写,表示公元.会根据nls的不同转换为公元或者ad等 无特殊注意事项 |
AM A.M. | 不会举例 | 上午的简写 ,同pm, p.m. (下午) , 中文环境输出为上午(如果是上午) |
BC B.C. | 不会举例 | 虽然标准的写法是B.c. (c小写) 或者BC,好在Oracle不讲究这个。表示公元前 |
CC SCC | SELECT TO_CHAR(SYSDATE,'CC YYYY-MM-dd') FROM DUAL --21 2017-07-05 | 返回世纪,以阿拉伯数字表示 如果年的后两位介于01-99那么,返回前两位+1,否则返回前两位 |
D | SELECT TO_CHAR(sysdate,'D') FROM dual --4 | 一周之中的某天,返回的是序号1-7(星期日-星期六) |
DAY | SELECT TO_CHAR(sysdate,'DAY') FROM dual --WEDNESDAY | 一周之中的某天,不过返回的是星期几而已,这和语言设置有关系,在中国环境 NLS_DATE_LANGUAGE=SIMPLIFIED CHINESE ,用星期一到星期天表示 |
DD | SELECT TO_CHAR(sysdate,'DD') FROM dual --05 | 月份中的某天(1-31) |
DDD | SELECT TO_CHAR(sysdate,'DDD') FROM dual --186 | 年份中的某天(1-366) |
DL | SELECT TO_CHAR(sysdate,'DL') FROM dual --Wednesday, July 05, 2017 | 返回长的日期格式。受到NLS_TERRITORY,NLS_LANGUAGE参数控制。例 2008年4月28日 星期一 限制:除了DL,其它什么的都不能设置。 |
DS | SELECT TO_CHAR(sysdate,'DS') FROM dual --7/5/2017 | 返回短的日期格式。受到NLS_TERRITORY,NLS_LANGUAGE参数控制。 例如 2008-04-28 限制:除了DL,其它什么的都不能设置。 |
DY | SELECT TO_CHAR(sysdate,'DY') FROM dual --WED | 日期的简称,就是星期几(当然这指的是中国环境下) |
HH | SELECT TO_CHAR(SYSDATE,'HH') FROM DUAL --07 | 表示小时,为12小时制(1-12)表示小时,为12小时制,同hh12(1-12) |
HH12 | SELECT TO_CHAR(SYSDATE,'HH12') FROM DUAL --07 | 表示小时,为12小时制(1-12) |
HH24 | SELECT TO_CHAR(SYSDATE,'HH24') FROM DUAL --07 | 表示小时,为24小时制(0-23) |
MI | SELECT TO_CHAR(SYSDATE,'MI') FROM DUAL --55 | 分(0-59) |
MM | SELECT TO_CHAR(SYSDATE,'MM') FROM DUAL --07 | 2位月(1-12) |
MON | SELECT TO_CHAR(SYSDATE,'MON') FROM DUAL --JUL | 月的简称,和国家有关系NLS_DATE_LANGUAGE,例如04在中文环境下用4月表示. |
MONTH | SELECT TO_CHAR(SYSDATE,'MONTH') FROM DUAL --JULY | 月的名称,国家有关系NLS_DATE_LANGUAGE,目前在中文下04表示为4月。 |
PM P.M. | | 同am,a.m.表示下午 |
Q | SELECT TO_CHAR(SYSDATE,'Q') FROM DUAL --3 | 季度(1-4) |
SS | SELECT TO_CHAR(SYSDATE,'SS') FROM DUAL --44 | 秒(0-59),一分钟内 |
SSSSS | | 一天从午夜开始的累积秒数.(0-86399) |
TS | SELECT TO_CHAR(SYSDATE,'TS') FROM DUAL --8:03:51 AM | 返回短日期格式内容,包括时分秒等,只能和dl,ds组合使用,格式是: dl ts或者ds ts ,中间以空格间隔开。 表现形式受NLS_TERRITORY 和NLS_LANGUAGE影响。 |
Y,YYY | SELECT TO_CHAR(SYSDATE,'Y,YYY') FROM DUAL --2017 | 四位年,用逗号分隔 |
YEAR SYEAR | SELECT TO_CHAR(SYSDATE,'YEAR') FROM DUAL --TWENTY SEVENTEEN | 发音表达的年 S前缀表示公元前BC |
YYYY SYYYY | SELECT TO_CHAR(SYSDATE,'YYYY') FROM DUAL --2017 | 四位年,S前缀表示公元前BC |
YYY YY Y | | 依次表示后面3,2,1位的年,例如2017 可以分别取值为017,17,7 |
小结:
下表的格式基本上也都可以用于TO_DATE, TO_TIMESTAMP, TO_TIMESTAMP_TZ, TO_YMINTERVAL,TO_DSINTERVAL函数;
从以上看,主要就是表示时间几个部分的格式:世纪、年,月,日,时,分,秒,毫秒,以及其它一些混合格式。每个时间部分都可以有多种的表达方式,通过这样归类就比较容易记忆;
3.很多格式可以组合使用,这样最终可以形成足够丰富的表达其形势;
4.很多格式和nls是密切相关的;
5.某些输出(返回)和格式大小写是有关系的,这在中文环境下体现不出来(目前来没有看到),但是english环境下就名下,以to_char(sysdate,'day')为例子,如果是西文环境是返回sun(假设sysdate位于周末),如果to_char(sysdate,'DAY')则返回SUN。
2.TO_NUMBER() --转换成字符串类型数据
3.TO_DATE() --转换成日期类型数据
UpdateTime--2017年7月7日11:48:22
使用注意事项:
使用to_char()将date类型数据转换成字符串时,可以只带一个参数
使用to_date()将varchar2类型转换成日期时,必须带两个参数
c.Date类型转varchar2
TO_CHAR(SYSDATE,'yyyy-MM-dd hh24:mm:ss')
转换格式不区分大小写;
c2.小时格式化:默认12小时,24小时格式转换时需要指明;
c3.分钟格式化:可以使用mi或mm。
d.varchar2-->Date
方法一:
TO_DATE(#SCHEDULE_DATE#,'YYYY-MM-DD hh24:mi')
前两个规则一样;
d3.转分钟时,必须使用mi,不能使用mm,否则会报错;
d4.如果格式化到分,会自动添加上0秒。
UpdateTime--2017年10月31日09:41:01
方法二:
DATE#SCHEDULE_DATE#
举例:
所以为了避免异常,转换分钟时,建议使用"mi"进行格式化;
Date类型可以直接进行加减运算。
示例:
g.
to_date是类型转换,不是格式转换,字符串和后面的格式要匹配;
g2.to_char才是转成对应格式。
操作日期类型
A.查询系统当前日期
B.将date类型转换成字符串类型 to_char(date类型,'转换格式')
说明:
[as]表示as关键字可带,可不带;
年月日需加上双引号;
别名不能加双引号。
C.将字符串类型转换成date类型 to_date('字符串类型','要转换的date类型格式')
说明:
如果直接sysdate的话,插入的时间带有时分秒;
将系统时间格式化后在插入:需先将其转换成字符串类型,进行格式化,再转换成指定格式的日期类型
D.当月一号至系统当前时间
UpdateTime--2017年7月21日14:53:12
E.使用trunc()函数对日期进行处理(截取,获取本周一的日期)
见下面1.3.17.1.2 trunc函数处理日期
F.
4.TRIM()--去除空格
2023年2月2日10:48:09
trim():去除字符串左右两边空格;
ltrim():去除字符串左边空格;
rtrim():去除字符串右边空格;
5.SUBSTR()--截取字符串
语法:
格式一:substr(str,i,n) 从第i个字符开始截取字符串,截取n个字符,区间 [i,i+n)
格式二:substr(str,i) 从第i个字符开始截取字符串至str的最后一个字符,区间 [i,str.length() - i + 2)
说明:
需要特别注意的是,与js不同的是:i不是字符所在下标索引,而是长度!
当i=0或1时,都是从第一位开始截取;
当i<0时,从右往左数,第-i个开始截取,截取n个字符;
当j>str.length()时,最后一位是str的最后一个字符。
由于-是关键符,所以别名需要用""包住。
6.UPPER()--将内容全部转换成大写
7.LOWER()--将内容全部转换成小写
8.NVL()
语法:
NVL(param1,param2)
含义:
a.用于判断第一个参数是否为空,如果param1==null,该函数值为param2;否则,该函数值为param1;相当于java中的三元运算符 value=param1 ? param1 :param2;
b.展示数据时,通常用来将null替换为0,在计数时通常使用。
举例:
9.SUM() 求和
语法:
SUM(数字column)
2021年12月22日11:31:19
如果原数据字段为空,求和结果也为空
10.DECODE()--分支函数
语法:
DECODE(VALUE,IF1,THEN1,IF2,THEN2,ELSE) 是对CASE WHEN 的简化
举例:
11.COUNT(1),COUNT(*),COUNT(columnName)
--都可用来查询表中有多少条数据(列)
--字段内容为空的不会被计数
12.GREATEST()--最大值
语法:
GREATEST(column1,column2,...)
输出该行数据的最大值
13.LEAST()--最小值
语法:
LEAST(column1,column2,...)
输出该行数据的最小值
举例:
查询苹果四季度销量的最大值和最小值
14.MAX()--最大值
语法:
MAX(数字column)
输出该字段的最大值
15.MIN()--最小值
语法:
MIN(数字column)
输出该字段的最小值
小结:
a.GREATEST()和LEAST(),横向比较,输出的是该行数据的最大值或最小值,后面可以跟其他字段一块进行查询;
MAX()和MIN() ,纵向比较,输出的是该字段的最大值或最小值,后面不能跟其他字段一块进行查询;
这四个函数通常用于比较数值字段,也可以用来比较其他类型字段,但是没意义。
16 EXISTS(),IN(),NOT EXISTS(),NOT IN()
16.1 EXISTS()与IN()
区别:
a.EXISTS是一个存在判断,如果后面的查询中有结果,则exists为真,否则为假
用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。
b.in 是一个集合运算符,a in {a,c,d,s,d....},这个运算中,前面是一个元素,后面是一个集合,集合中的元素类型是和前面的元素一样的
它后面带的select一定是选一个字段,而不是select *
c.sql
select * from 表A where exists(select * from 表B where 表B.id=表A.id)
这句相当于
select * from 表A where id in (select id from 表B)
d.子查询表大的用exists,子查询表小的用in
16.2 NOT EXISTS()与NOT IN()
区别:
如果查询语句使用了not in,那么对内外表都进行全表扫描,没有用到索引;而not exists的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in 要快。
UpdateTime--2017年6月7日14:21:19
参考链接:javascript:void(0)
17.TRUNC()与ROUND()
17.1 TRUNC()
1.3.17.1.1 trunc函数处理数字
用途:单纯地对数字进行截取处理,不做四舍五入操作
语法:
TRUNC(number[,decimal_places])
参数说明:
number 待做截取处理的数值
decimals 指明需保留小数点后面的位数。可选项,不带该参数时,截去所有的小数部分。
具体用法:oracle 补齐两位小数(不足补0)
1.3.17.1.2 trunc函数处理日期
用途:对日期进行截取处理
语法:
TRUNC(date[,fmt])
具体用法:Oracle trunc()、interval、extract()处理日期类型
17.2 ROUND()
用途:对数字进行四舍五入操作
用法:和tranc()函数的用法大致相同,不同的是使用该函数会以四舍五入的方式进行截取
1.不带第二个参数,默认只保留整数位,执行四舍五入操作;
2.带第二个参数:
2.1 当参数为正数时:
2.1.1 当要保留的小数位 < 要截取的小数位数时,进行截取并四舍五入;
2.1.2 当要保留的小数位 > 要截取的小数位数时,返回原数字。
2.2 当参数为负数时:
2.2.1 当要保留的整数位 < 要截取的整数位数时,从整数的个位倒序(个,十,百...位)进行截取并四舍五入;
2.2.2 当要保留的整数位 > 要截取的整数位数时,返回0。
语法:
ROUND(number[,decimal_places])
参数说明:
number 待做四舍五入的数值
decimal_places 四舍五入 , 保留几位小数。可选项,不带该参数时,只保留整数,执行四舍五入操作。
举例:
关于截取日期的用法,见文末推荐。
18.CEIL()与FLOOR()
1.3.18.1 CEIL()
用途:取大于等于数值number的最小整数
语法:
CEIL(number)
举例:
1.3.18.2 FLOOR()
用途:取小于等于数值number的最大整数
语法:
FLOOR(number)
举例:
UpdateTime--2017年6月29日10:07:58
19.CONCAT()--字符串拼接
字符串拼接,通常使用管道符||
用途:拼接字符串,不推荐使用
语法:
CONCAT('字符1','字符2')
举例:
UpdateTime--2017年7月21日14:56:43
20.NEXT_DAY()
用途:获取指定时间的下一个星期几(由char指定)所在的日期
语法:
NEXT_DAY(date,char)
date-日期类型
char-数字1~7或Monday~Sunday
注意:
数字1~7分别代表星期日~星期六,1表示星期日,2代表星期一,以此类推;
(2)当第二个参数传的星期数<=现有星期数时,会返回下一个星期的日期;当第二个参数所传的星期数>现有星期数时,则会返回本周的相应星期日期。
举例:根据系统当前时间查出本周一和本周日所在日期
结果展示:
21.REPLACE()--替换指定内容
语法:
replace(字符串,被替换字符串,替换后的字符串)
number[(总位数[,小数位])]
默认情况下,可以不设置可存储数值的位数;
当不设置小数位时,只能存储整数;
number(5,3)表示的是:可存储5-3=2位整数,小数点后保留3位。
2023年2月2日10:50:32
22.TRANSLATE()--替换指定内容
剔除字符串当中的数字
写在最后
哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!
作者:Marydon