学习笔记:Oralce函数大全

Oracle

      •      编者按
      •      01. 字符函数
        •          1.01 CHR(n)
        •          1.02 CONCAT(ch1, ch2)
        •          1.03 INITCAP(ch)
        •          1.04 UPPER(ch)
        •          1.04 LOWER(ch)
        •          1.05 LPAD(expr1, n, expr2)、RPAD(expr1, n, expr2)
        •          1.06 NLS_INICAP(ch)、NLS_LOWER(ch)、NLS_UPPER(ch)
        •          1.07 REGEXP_REPLACE(source, pattern, replace_str, pos, occ, par)
        •          1.08 REGEXP_SUBSTR(source, pattern, pos, occ, par)
        •          1.09 REPLACE(source, search_str, replace_str)
        •          1.10 TRIM(trim_source)、LTRIM(ch)、RTRIM(ch)
        •          1.11 SOUNDE(ch)
        •          1.12 SUBSTR(ch, pos, length)
        •          1.13 TRANSLATE(expr, from_str, to_str)
        •          1.14 ASCII(ch)
        •          1.15 INSTR(str, substr)
        •          1.16 INSTRB
        •          1.17 LENGTH(ch)
        •          1.18 LENGTHB
        •          1.19 NLSSORT(ch)
      •      02. 数学函数
        •          2.01 ABS(n)
        •          2.02 ACOS(n)
        •          2.02 COS(n)
        •          2.02 COSH(n)
        •          2.03 ASIN(n)
        •          2.03 SIN(n)
        •          2.03 SINH(n)
        •          2.04 ATAN(n)
        •          2.04 TAN(n)
        •          2.04 TANH(n)
        •          2.05 ATAN2(n1, n2)
        •          2.06 CEIL(n)
        •          2.07 FLOOR(n)
        •          2.08 EXP(n)
        •          2.09 LN(n)
        •          2.10 LOG(n1, n2)
        •          2.11 MOD(n1, n2)
        •          2.12 POWER(n1, n2)
        •          2.13 ROUND(date, fmt)
        •          2.14 SIGN(n)
        •          2.15 SQRT(n)
        •          2.16 TRUNC(date, fmt)
      •      03. 日期时间函数
        •          3.01 ADD_MONTHS(date, int)
        •          3.02 CURRENT_DATE
        •          3.03 CURRENT_TIMESTAMP
        •          3.04 DBTIMESONE
        •          3.05 EXTRACT
        •          3.06 FROM_TZ
        •          3.07 LAST_DAY
        •          3.08 MONTHS_BETWEEN
        •          3.09 NEW_TIME
        •          3.10 NEXT_DAY
        •          3.11 NUMTODSINTERNAL
        •          3.12 NUMTOYMINTERNAL
        •          3.13 ROUND


     编者按

截至2020 0717,感觉我找的是最全的,没有之一!
这篇文章全是手敲,就连代码也不例外,复制后 去运行 难免出错,还请指正。 ^. ^


     01. 字符函数

1.01 ~ 1.13 返回的是字符值
1.14 之后 返回的是数字

         1.01 CHR(n)

SELECT 
	CHR(54740) 别名1, 
	CHR(65) 别名2 
FROM DUAL;

---->
别名1   别名2
赵      A

功能: 给出整数X,返回对应的ASCII码字符。CHR和ASCII是一对反函数。
测试: 中文字符返回的是乱码… 跟编码也有关系吗? 自己研究去吧。

         1.02 CONCAT(ch1, ch2)

SELECT 
	CONCAT('520', '1314') || '嘿嘿' AS "C1", 
	'520' || '1314' AS "C2", CONCAT(520, 1314) AS "C3" 
FROM DUAL;

---->
C1           C2        C3
5201314嘿嘿   5201314   5201314

功能: 连接两个字符串;与 “||” 的区别,concat只能连接2个字符串, “||” 可以连接多个;MySQL中的concat可以连接多个字符串,即concat(ch1, ch2, ch3 ,…).
测试: OK.

         1.03 INITCAP(ch)

SELECT 
	INITCAP('smith pEOVE') "R1", 
	INITCAP('smith!pEOVE') "R2", 
	INITCAP('smith7pEOVE') "R3" 
FROM DUAL;

---->
R1            R2            R3
Smith Peove   Smith!Peove   Smith7peove

功能: 返回字符单词首字母大写,其余小写,单词首字母大写判断 用空格 和 非字母非数字 字符分隔。
测试: OK.

         1.04 UPPER(ch)

SELECT UPPER('PeoVE 7') RESULT FROM DUAL;

---->
RESULT
PEOVE 7

功能: 所有字母大写.
不是字母的字符不变;
如果 ch 是 CHAR 数据类型的,那么结果也是CHAR类型的;
如果 ch 是 VARCHAR2 类型的,那么结果也是 VARCHAR2 类型的。
补充: SELECT UPPER(字段名) RESULT FROM DUAL;
测试: OK.

         1.04 LOWER(ch)

SELECT LOWER('PeoVE') RESULT FROM DUAL;

---->
RESULT
peove

功能: 所有字母小写.
补充: SELECT LOWER(字段名) RESULT FROM DUAL;
测试: OK.

         1.05 LPAD(expr1, n, expr2)、RPAD(expr1, n, expr2)

SELECT 
	LPAD('peove', 10, '-') R1,
	LPAD('peove', 10) R2,
	LPAD('Peove', 3, '#') R3,
	LPAD('Peove', 7, 'ABC') R4
FROM DUAL;

---->
R1           R2            R3    R4
-----peove   |     peove   Peo   ABPeove

功能:
在 expr1 字符左边或右边粘贴数个 expr2 字符,直到字符总字节数达到 n 字节;expr2默认为空格。 ( LPAD 在列的左边粘贴字符,RPAD 在列的右边粘贴字符 )
如果 expr1 长度大于 n,则返回 expr1 左端 n 个字符。
如果 expr2 的长度要比 n 字符少,就复制 补充长度到 n。
如果 expr2 多于 n 字符,则仅 expr2 前面的 n 各字符被使用。
补充: RPAD 就不试了;当然也可以联合使用,如:LPAD(RPAD(‘Peove’, 7, ‘-’), 10, ‘#’).
测试: OK.

         1.06 NLS_INICAP(ch)、NLS_LOWER(ch)、NLS_UPPER(ch)

测试:
数据库函数提示只有第一个参数,如标题所写的那样,并没有这样的 NLS_INICAP(ch, nlsparams);
只用一个参数:和INICAP、LOWER、UPPER用法一样。
两个参数都用:第2个参数可以写 ‘NLS_SORT= SCHINESE_RADICAL_M’,但效果跟没有一样。

这三个函数等 高手 来补充。

         1.07 REGEXP_REPLACE(source, pattern, replace_str, pos, occ, par)

SELECT 
	REGEXP_REPLACE('HELLO world', 'o', '*') R1, 
	REGEXP_REPLACE('HELLO 171', '\d', '*') R2, 
	REGEXP_REPLACE('HELLO 171y', '\d+', '*') R3, 
	REGEXP_REPLACE('HeLLO 171', '[a-z0-9]', '*') R4, 
	REGEXP_REPLACE('HeLLO 171', '[a-zA-Z]', '*', 2, 1) R5, 
FROM DUAL;

---->
R1            R2	      R3		 R4			 R5
HELLO w*rld   HELLO ***   HELLO *y   H*LLO ***   H*LLO 171

功能: 10g新增函数,扩展了REPLACE函数的功能,并且用于按照特定正则表达式的规则替换字符串。
其中参数 (后面3个参数也可以不写)
source 指定源字符表达式,
pattern 指定正则表达式,
replace_str 指定替换字符串,
pos 起始位置(默认从1开始),
occ 替换的次数(0是无限次),
par 不区分大小写。
补充: [正则表达式的使用](https://blog.csdn.net/TUBER727/article/details/11063377?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare&depth_1####          1.14 UPPER(ch)

SELECT UPPER('PeoVE 7') RESULT FROM DUAL;

---->
RESULT
PEOVE 7

功能: 所有字母大写.
不是字母的字符不变;
如果 ch 是 CHAR 数据类型的,那么结果也是CHAR类型的;
如果 ch 是 VARCHAR2 类型的,那么结果也是 VARCHAR2 类型的。
补充: SELECT UPPER(字段名) RESULT FROM DUAL;
测试: OK.-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare)
测试: OK.

         1.08 REGEXP_SUBSTR(source, pattern, pos, occ, par)

SELECT 
	REGEXP_SUBSTR('http://www.oracle.com/products', 'http://([[:alnum:]\.?]+)') RESULT
FROM DUAL;

---->
RESULT
http://www.oracle.com

功能: 10g新增函数,扩展了SUBSTR函数的功能,并且用于按照特定表达式的规则返回字符串的子串。
其中参数 (后面3个参数也可以不写)
source 指定源字符表达式,
pattern 指定正则表达式,
pos 起始位置(默认从1开始),
occ 替换的次数(0是无限次),
par 不区分大小写。
补充: [[:alnum:]] 是所有的字母和数字。
测试: OK.

         1.09 REPLACE(source, search_str, replace_str)

SELECT 
	REPLACE('Fuck!!', 'Fuck', '*') RESULT
FROM DUAL;

---->
RESULT
*!!

功能: 把 source 中的所有的子字符串 search_str 用可选的 replace_str 替换,如果没有指定replace_str,所有的string中的子字符串search_str都将被删除。REPLACE是TRANSLATE所提供的功能的一个子集。
补充: 只能替换单个,想用高级的,用REGEXP_REPLACE
测试: OK.

         1.10 TRIM(trim_source)、LTRIM(ch)、RTRIM(ch)

SELECT 
	TRIM('  p e o v E  ') R1,
	TRIM('e' FROM 'eep e o v Ee') R2,
	LTRIM('eepeove', 'e') R3,
	RTRIM('eepeove', 'vee') R4
FROM DUAL;

---->
R1          R2			R3		R4
p e o v E   p e o v E   peove   eepeo

功能:
TRIM 修理左边和右边的,中间不处理;
LTRIM 只处理左边;
RTRIM 只处理右边。
补充:
TRIM、LTRIM、RTRIM 缺省值是 ‘’;
TRIM 只能写单字符,如 TRIM('e’e FROM ‘eep e o v Ee’) R2,会报错;
TRIM 想去掉两边 自定义的单字符时,需要用FROM,没有第2个参数用法;
LTRIM 和 RTRIM 有第2个参数,且可以写多字符。
测试: OK.

         1.11 SOUNDE(ch)

SELECT 
	SOUNDEX('weather') R1,
	SOUNDEX('wather') R2,
	SOUNDEX('WEther') R3,
	SOUNDEX('wqyrt') R4,
	SOUNDEX('SUNDAY') R5
FROM DUAL;

---->
R1	   R2	  R3  	 R4	    R5
W360   W360   W360   W263   S530

功能: 返回 ch 的声音表示形式;这对于比较两个拼写不同但是发音类似的单词而言很有帮助,如果字符发音相同,则返回的结果会一致。
补充: SELECT 字段名 RESULT FROM 表明 WHERE SOUNDEX(字段名) = SOUNDEX(‘wear’);
测试: OK.

         1.12 SUBSTR(ch, pos, length)

SELECT
	SUBSTR('我要稳稳的幸福 能抵挡末日的残酷 在不安的深夜 能有个归宿', 3, 10) R1,
	SUBSTR('17807211314', 3, 20) R2,
	SUBSTR('17807211314', 3) R3
FROM DUAL;

---->
R1				   R2		   R3
稳稳的幸福 能抵挡末   807211314   807211314  

功能: 截取字符串,从第 pos(包含)个开始取 length 个字符,这个务必要注意,必须是字符。 VARCHAR2最长4000个字节,GBK编码中一个中文字符占2个字节,韩文字符占4个字节,如果 ch 是 date 或者 number 的数据类型,会自动转化为 VARCAHR2。
补充: 如果 length 超出了长度 或者 不写,都会截取到最后。
测试: OK.

         1.13 TRANSLATE(expr, from_str, to_str)

SELECT
	TRANSLATE('2abc1314', '01234abcde', '99999XXXXX') R1,
	TRANSLATE('2abc1314f', '01234abcdef', '99999XXXXX') R2,  /** 第2个参数比第3个参数长, 多的是f, 没有在第3个的位置找到对应的替换, 就会被删除了. */
	TRANSLATE('2abc1314', '012ab', '*****-----') R3,  /** 第3个参数比第2个长 无所谓 */
	TRANSLATE('2abc1314', '012ab', '*-') R4,  /** 2在'012ab'里, 但 '012ab' 所在的位置 在 '*-' 是没有的, 所以显示 '' */
	REPLACE(TRANSLATE('A中国Yd1234', '0123456789', '0000000000'), '0') R5,
	LENGTH(TRANSLATE(',01234,567,,8,', 'a123456789', ' ')) R6  /** 'a123456789' 中 逗号出现的次数, 第3个参数不能写 '' 不然结果会null; 第2个参数 开头必须个 expr不存在的, 比如 a、!、@等 来抵消第3个参数第1个位置的空格, 不写的话结果就多1. */
FROM DUAL;

---->
R1
PEOVE

功能: 将字符 expr 按照 from_str 与 to_str 的对应规则进行处理,返回将所出现的 from_str 中的每个字符替换为 to_str 中的相应字符以后的 expr;TRANSLATE 是 REPLACE 所提供的功能的一个超集。
如果 from_str 比 to_str 长,那么在 from_str 中而不在 to_str 中而外的字符将从 expr 中被删除,因为它们没有相应的替换字符; to_str 不能为空,Oracle把空字符串认为是NULL,并且如果 TRANSLATE 中的任何参数为NULL,那么结果也是NULL。
测试: OK.

         1.14 ASCII(ch)

SELECT 
	ASCII('A') A, 
	ASCII('a') a, 
	ASCII('0') ZERO, 
	ASCII(' ') SPACE, 
FROM DUAL;

---->
A    a	  ZERO   SPACE
65   97   48     32

功能: 返回 ch 字符串首字符的十进制表示 ASCII 码值。 CHR 和 ASCII 是互为相反的函数;CHR 得到给定字符编码的响应字符, ASCII得到给定字符的字符编码。
测试: OK.

         1.15 INSTR(str, substr)

SELECT 
	INSTR('rang oracle Traning', 'ra') R1,
	INSTR('rang oracle Traning', 'ra', 1, 2) R2, /** 第3个参数:从'ra'第1次出现的位置开始;第4个参数:'ra'第2次出现的位置 */
	INSTR('rang oracle Traning', 'ra', 2, 2) R3,
	INSTR('rang oracle Traning', 'ra', 3, 2) R4, /** 第3个参数 超出了 第2个参数 所在 第1个参数的次数时, 都会返回 第2个参数 在 第1个参数 最后一次出现的位置 */
	INSTR('rang oracle Traning', 'ra', 1, 1) R5,
	INSTR('rang oracle Traning', 'ra', 1, 4) R6, /** 第4个参数 超出了 次数时, 没有找到会返回 0 */
FROM DUAL;

---->
R1   R2   R3   R4   R5   R6
1    7    14   14   1    0

功能: 得到在 str 中包含 substr 的位置。在 str 字符串中搜索 substr 字符,返回发现指定的字符的位置。
a>0,str 是从左边开始检查的,开始的位置为a;
a<0,str 是从右边开始进行扫描的,开始的位置为a。
第b次出现的位置将被返回; a和b都缺省设置为1,这将会返回在 str 中第一次出现 substr 的位置;如果 substr 在 a 和 b 的规定下没有找到,那么返回0。位置的计算是相对于 str 的开始位置的,不管a和b的取值是多少。

str 被搜索的字符串
substr 希望搜索的字符串
a 搜索的开始位置,默认为1(如果为负数会从后向前搜索)
b 出现的位置,默认为1

补充: str 和 substr 是区分大小写的。
测试: OK.

         1.16 INSTRB

SELECT 
	INSTRB('rang oracle Traning', 'ra') R1,
	INSTRB('rang oracle Traning', 'ra', 2, 1)R2
FROM DUAL;

---->
R1   R2
1    7

功能: 和INSTR相同,只是操作的对参数字符使用的位置的是字节。
补充: Navicat 对这个函数 没有提示。
测试: OK.

         1.17 LENGTH(ch)

SELECT 
	LENGTH('酒醉的蝴蝶') R1,
	LENGTH(' 1314 ') R2,
	LENGTH('') R3
FROM DUAL;

---->
R1   R2   R3
5    6    null

功能: 返回字符串的长度;特别注意的,对于空的字段,返回为空,而不是0。
测试: OK.

         1.18 LENGTHB

SELECT 
	LENGTH('酒醉的蝴蝶1314') R1,
	LENGTH('酒醉的蝴蝶') R2,
	LENGTH(' 1314 ') R3,
	LENGTH('') R4
FROM DUAL;

---->
R1   R2   R3   R4
19   15   6    null

功能: 返回以字节为单位的 ch 的长度,对于单字节字符集 LENGTHB 和LENGTH 是一样的。
补充: Navicat 对这个函数 没有提示。1个汉子是3个 Byte,数字和字母是1个 Byte,应该是 UTF-8 吧?
测试: OK.

         1.19 NLSSORT(ch)

SELECT 
	SELECT XM FROM RYGL ORDER BY NLSSORT('XM', 'NLS_SORT=SCHINESE_STROKE_M');  /** 按照笔画排序, 数字在前 */
	SELECT XM FROM RYGL ORDER BY NLSSORT('XM', 'NLS_SORT=SCHINESE_RADICAL_M'); /** 按部首排序, 数字在前 */
	SELECT XM FROM RYGL ORDER BY NLSSORT('XM', 'NLS_SORT=SCHINESE_PINYIN_M');  /** 按照首字母拼音排序(也可以将 英文首字母排序 a b c d ...), 数字在前 */
	SELECT XM FROM RYGL ORDER BY NLSSORT('XM', 'NLS_SORT=BINARY_CI');          /** 顺序:空格、数字、排序 */
FROM DUAL;

功能: 表:RYGL,字段:XM;按照 笔画、部首、拼音 对 XM进行排序。
Session级别的设置,修改 ORACLE 字段的默认排序方式:

按拼音:alter session set nls_sort = SCHINESE_PINYIN_M;
按笔画:alter session set nls_sort = SCHINESE_STROKE_M;
按偏旁:alter session set nls_sort = SCHINESE_RADICAL_M;
忽略大小写:alter session set nls_sort = BINARY_CI;

注意: NLS_SORT 是性能杀手,设置 NLS_SORT 就不走索引了。
测试: OK.


     02. 数学函数

数学函数的输入和输出都是数字型,并且多数函数精确到38位;
cos / cosh / exp / ln / log / sin / sinh / sqrt / tan/ tanh 精确到36位;
acos / asin / atan / atan2 精确到30位。
数学函数可以在sql语句和plsql块中引用。

参数是 数字的,也可以用纯数字的字符;如果里面 有英文,则报错。 如

SELECT ABS('1314') FROM DUAL

         2.01 ABS(n)

SELECT 
	ABS(100) R1,
	ABS(-100) R2,
	ABS('-100') R3,
FROM DUAL;

---->
R1	  R2	R3
100   100   100

功能: 得到 n 的绝对值。
补充: 如果 ’ ’ 里有非数字,报错:ORA - 01722: invalid number.
测试: OK.

         2.02 ACOS(n)

SELECT 
	ACOS(1)   R1, /** cos0° = 1 */
	ACOS(-1)  R2,
	ACOS(0.5) R3, /** 写成 ACOS(1/2) 也可 */
	ACOS(0)   R4, /** cos90° = 0, 返回结果 涉及 角度和弧度的换算: 弧度 = 角度 * π / 180. */
FROM DUAL;

---->
R1   R2			R3		   R4
0    3.141592   1.047197   1.570796

功能: 返回 n 的反余弦值,n 应该从-1到1之间的数,结果在 0 到 π 之间,输出以弧度为单位。
补充: 实际返回 小数点 30位数字,这里取 6位。
测试: OK.

         2.02 COS(n)

SELECT 
	COS('3.14159')   R1, /** 参数是 弧度, cos180° = -1 */
	COS('-1')  R2,
	COS(0.5)   R3, 
	COS(0)     R4, /** cos0° = 1, 返回结果 涉及 角度和弧度的换算: 弧度 = 角度 * π / 180. */
FROM DUAL;

---->
R1   		R2		   R3		  R4
-0.999999   0.540302   0.877582   1 

功能: 返回 n 的余弦值,输出以弧度为单位。
补充: 实际返回 小数点 36位数字,这里取 6位。
测试: OK.

         2.02 COSH(n)

SELECT 
	COS('3.14159')   R1,
	COS('-1')  R2,
	COS(0.5)   R3, 
	COS(0)     R4,
FROM DUAL;

---->
R1   		R2		   R3		  R4
11.591922   1.543080   1.127625   1 

功能: 返回 n 的双曲余弦值,输出以弧度为单位。
补充: 实际返回 小数点 36位数字,这里取 6位。
测试: OK.

         2.03 ASIN(n)

SELECT 
 	ASIN(1)   R1, /** sin0° = 0 */
	ASIN(-1)  R2,
	ASIN(0.5) R3, /** 写成 ASIN(1/2) 也可 */
	ASIN(0)   R4, /** sin90° = 1, 返回结果 涉及 角度和弧度的换算: 弧度 = 角度 * π / 180. */
FROM DUAL;

---->
R1		   R2		   R3   	  R4
1.570796   -1.570796   0.523598   0

功能: 返回 n 的反正弦值,n的范围应该是 -1到 1之间,返回的结果在 -π/2 到 π/2 之间,输入、输出以弧度为单位。
测试: OK.

         2.03 SIN(n)

SELECT 
	SIN(3.14159/2) R1, /** sin90° = 1 */
	SIN(-1)  R2,
	SIN(0.5) R3,
	SIN(0)   R4
FROM DUAL;

---->
R1	 	   R2		   R3		  R4
0.999999   -0.841470   0.479425   0

功能: 计算 n 的正弦值; n 是一个以弧度表示的角度。
测试: OK.

         2.03 SINH(n)

SELECT 
	SIN(1)   R1, 
	SIN(-1)  R2,
	SIN(0.5) R3,
	SIN(0)   R4
FROM DUAL;

---->
R1	 	   R2		   R3		  R4
1.570796   -1.570796   0.523598   0

功能: 返回 n 的双曲正弦值。n 是一个以弧度表示的角度。
测试: OK.

         2.04 ATAN(n)

SELECT 
 	ATAN(1)   R1, /** tan45° = 1 */
	ATAN(-1)  R2,
	ATAN(0.5) R3, /** 写成 ATAN(1/2) 也可 */
	ATAN(0)   R4, /** tan0° = 0, 返回结果 涉及 角度和弧度的换算: 弧度 = 角度 * π / 180. */
FROM DUAL;

---->
R1		   R2 		   R3		  R4
0.785398   -0.785398   0.463647   0

功能: 计算 n 的反正切值,返回值在 -π/2 到 π/2 之间,输出单位是弧度。
测试: OK.

         2.04 TAN(n)

SELECT 
	TAN(0) R1, /** tan0° = 0 */
	TAN(3.14159/4) R2, /** tan45° = 1 */
	TAN(3.14159) R3
FROM DUAL;

---->
R1   R2			   R3
0    0.999998...   753695.995174...

功能: 计算 n 的正切值。n 是一个以弧度位单位的角度。
测试: OK.

         2.04 TANH(n)

SELECT 
	TANH(0) R1,
	TANH(3.14159/4) R2,
	TANH(3.14159/2) R3
FROM DUAL;

---->
R1   R2			   R3
0    0.655793...   0.917152

功能: 计算 n 的双曲正切值。
测试: OK.

         2.05 ATAN2(n1, n2)

SELECT 
 	ATAN2(1, 2)   R1, 
	ATAN2(-1, 2)  R2,
	ATAN2(0.5, 1) R3, 
	ATAN2(0, 1)   R4, 
FROM DUAL;

---->
R1		   R2		   R3 		  R4
0.463647   -0.463647   0.463647   0

功能: 返回 n1 除以 n2 的反正切值,结果在 -π/2 到 π/2 之间,输出单位是弧度。
补充: 第2个参数 不能写0,因为 分母为0 不成立,报错:ORA - 01426: numeric overflow.
测试: OK.

         2.06 CEIL(n)

SELECT 
	CEIL(3.14157)    R1,
	CEIL('-3.14157') R2
FROM DUAL;

---->
R1	 R2
4    -3

功能: 向上取整。
补充: 纯数字的 字符也可以。
测试: OK.

         2.07 FLOOR(n)

SELECT 
	FLOOR(3.14157)    R1,
	FLOOR('-3.14157') R2
FROM DUAL;

---->
R1	 R2
3    -4

功能: 向下取整。
补充: 纯数字的 字符也可以。
测试: OK.

         2.08 EXP(n)

SELECT 
	EXP(1)   R1,
	EXP('2') R2
FROM DUAL;

---->
R1	 	   R2
2.718281   7.389056

功能: 计算 e 的 n 次幂; e为自然对数,约等于2.718281。
补充: 纯数字的 字符也可以。
测试: OK.

         2.09 LN(n)

SELECT 
	LN(1) R1, /** e 的0次幂 = 1 */
	LN(2) R2,
	LN(EXP(1)) R3 /** EXP(1) = e, e 的1次幂 = e */
FROM DUAL;

---->
R1   R2	 	  	  R3
0    0.693147..   1

功能: 返回 n 的自然对数;x必须是正数,并且大于0。
测试: OK.

         2.10 LOG(n1, n2)

SELECT 
	LOG(2, 1) R1, /** 2 的 0 次幂 = 1 */
	LOG(2, 4) R2  /** 居然出现了精度丢失 ??! */
FROM DUAL;

---->
R1   R2	 	  
0    1.999999...

功能: 计算以 n1 为底的 n2 的对数。n1 > 0 ADN n1 != 1,n2 > 0。
补充: log21 = 0.
测试: OK; 但是出现了 精度丢失,结果如上.

         2.11 MOD(n1, n2)

SELECT 
	MOD(10, 3) R1,
	MOD(3, 3)  R2,
	MOD(3, 0)  R3,
	MOD(2, 3)  R4
FROM DUAL;

---->
R1	 R2	  R3   R4	  
1    0    3    2

功能: 取余函数。
返回 n1 除以 n2 的余数;
如果 n2 是 0,则返回 n1,
如果 n1 < n2,则返回n1。
测试: OK.

         2.12 POWER(n1, n2)

SELECT 
	POWER(2, 10) R1,
	POWER(3, 3)  R2
FROM DUAL;

---->
R1	   R2  
1024   27

功能: 计算 n1 的 n2 次幂。
补充: POWER(2, 10) --> 210 = 1024
测试: OK.

         2.13 ROUND(date, fmt)

SELECT 
	ROUND(55.655) R1,
	ROUND(55.655, 2) R2,
	ROUND(45.654, -1) R3,
	ROUND(45.654, -2) R4,
	ROUND(50.654, -2) R5,
	ROUND(TO_DATE('2020-07-27', 'yyyy-mm-dd'), 'year')  R6, /** 1-6月 7-12月 四舍五入 到最近的 yyyy年1月 */
	ROUND(TO_DATE('2020-07-27', 'yyyy-mm-dd'), 'month') R7, /** 1-15日 16-31日 四舍五入到最近的 mm月1日 */
	ROUND(TO_DATE('2020-07-27', 'yyyy-mm-dd'), 'day')   R8  /** 星期1-星期3 星期4-星期7 四舍五入到最近的 星期天 */
FROM DUAL;

---->
R1	 R2	     R3	  R4   R5	 R6				  	   R7					 R8
56   55.66   50   0    100   2021-01-01 00:00:00   2020-08-01 00:00:00   2020-07-26 00:00:00

功能: 四舍五入函数。
fmt 缺省值为0,date 保留整数;
fmt > 0,date 保留小数点右边 fmt 位;
fmt <0,date 保留小数点左边 |fmt| 位;
可以对时间进行 round,效果是只保留年月日。
测试: OK.

         2.14 SIGN(n)

SELECT 
	SIGN(1314)  R1,
	SIGN(-1314) R2,
	SIGN(0)     R3
FROM DUAL;

---->
R1	  R2   R3	  
1    -1    0

功能: 检测 n 的正负。
如果 n < 0 返回 -1;
如果 n = 0 返回 0;
如果 n > 0 返回 1。
补充: 常与 decode 结合使用。
测试: OK.

         2.15 SQRT(n)

SELECT 
	SQRT(64) R1,
	SQRT(2) R2
FROM DUAL;

---->
R1   R2
8    1.414213

功能: 返回 n(n > 0) 的平方根。
测试: OK.

         2.16 TRUNC(date, fmt)

SELECT 
	TRUNC(77.1314) R1,
	TRUNC(77.1314, 2)  R2,
	TRUNC(77.1314, -2) R3,
	TRUNC(77.1314, -1) R4
FROM DUAL;

---->
R1   R2      R3   R4
77   77.13   0    70

功能: 截取数字函数,只舍不入函。
fmt 缺省值为0,date 保留整数;
fmt > 0,date 保留小数点右边 fmt 位;
fmt < 0,date 保留小数点左边 |fmt| 位。
测试: OK.


     03. 日期时间函数

日期时间函数用于处理date和timestamp类型的数据,除了函数 months_between 返回数字外,其余均返回date类型;
Oracle以7位数字格式来存放日期数据,包括世纪、年、月、日、小时、分钟、秒,并且默认日期显式格式为 “DD-MON-YY”。

         3.01 ADD_MONTHS(date, int)

SELECT 

FROM DUAL;

---->
R1

功能: 返回日期 date 加上 int 个月后的月份。
int 可以是任意整数。如果结果日期中的月份所包含的天数比 date 日期中的“日”分量要少。(即相加后的结果日期中的日分量信息已经超过该月的最后一天,例如,8月31日加上一个月之后得到9月31日,而9月只能有30天)返回结果月份的最后一天。

测试: OK.


         3.02 CURRENT_DATE

SELECT 

FROM DUAL;

---->
R1

功能: 9i 新增函数,返回当前会话时区所对应的日期时间。
补充: 和 SYSDATE 功能一样。
测试: OK.


         3.03 CURRENT_TIMESTAMP

SELECT 

FROM DUAL;

---->
R1

功能:
测试: OK.


         3.04 DBTIMESONE

SELECT 

FROM DUAL;

---->
R1

功能:
测试: OK.


         3.05 EXTRACT

SELECT 

FROM DUAL;

---->
R1

功能:
测试: OK.


         3.06 FROM_TZ

SELECT 

FROM DUAL;

---->
R1

功能:
测试: OK.


         3.07 LAST_DAY

SELECT 

FROM DUAL;

---->
R1

功能:
测试: OK.


         3.08 MONTHS_BETWEEN

SELECT 

FROM DUAL;

---->
R1

功能:
测试: OK.


         3.09 NEW_TIME

SELECT 

FROM DUAL;

---->
R1

功能:
测试: OK.


         3.10 NEXT_DAY

SELECT 

FROM DUAL;

---->
R1

功能:
测试: OK.


         3.11 NUMTODSINTERNAL

SELECT 

FROM DUAL;

---->
R1

功能:
测试: OK.


         3.12 NUMTOYMINTERNAL

SELECT 

FROM DUAL;

---->
R1

功能:
测试: OK.


         3.13 ROUND

SELECT 

FROM DUAL;

---->
R1

功能:
测试: OK.


你可能感兴趣的:(学习笔记)