内置数据类型与内置函数
内置数据类型
| 类型名 |
|---|
| binary_float |
| binary_double |
| char |
| date |
| interval year to month |
| interval day to second |
| long |
| number |
| raw |
| timestamp |
| timestamp with time zone |
| timestamp with local time zone |
| varchar |
| varchar2 |
| xmltype |
内置函数类型
| 函数名 | 功能描述 |
|---|---|
| add_months | 函数将一个月数(n)添加一个日期,并返回相隔n月的同一天,支持参数:date, number |
| asciistr | 传入字符串,返回对应的ASCII字符 |
| compose | 将基本字符和组合标记组合一个复合Unicode字符 |
| current_date | 返回当前时区的当前日期 |
| current_timestamp | 返回当前时区的当前日期与当前时间,包含当前时区信息。支持参数:integer, 说明:返回的时间可调整精度 |
| decompose | 将复合Unicode字符(如带有重音或特殊符号的字符)分解为其基本字符和组合标记 |
| from_tz | 将时间从一个时区转换为另一个时区,支持参数;timestamp, text |
| hextoraw | 将字符串表示的二进制数值转换为一个raw数值。支持参数:text |
| instrb | 字符串查找函数,返回字符串的位置,支持参数: varchar2, text, number DEFAULT 1, number DEFAULT 1 |
| length | 求取指定字符串字符的长度,支持参数:char/integer/varchar2 |
| lengthb | 求取指定字符串字节的长度,支持参数:char/bytea/varchar2 |
| localtimestamp | 返回会话中的日期和时间,支持参数:integer, 函数中增加参数为精度 |
| ltrim | 去除指定字符串的左侧空格或对应数据,支持参数:varchar2 /varchar2,varchar2 |
| months_between | 返回日期类型的date1和date2之间相差的月份,支持参数:date,date,说明:如果date1晚于date2,返回正数;如果date1早于date2返回负数;如果date1和date2是某月里的同一天,返回结果为整数;如果不是同一天,会在每月31天的基础上返回带有小数部分的结果 |
| next_day | 返回指定日期的下一个日期。支持参数:date, integer /date ,text, 说明:当函数中第二个参数传的星期数比现有星期数小时,会返回下一个星期的日期;当函数中第二个参数所传的日期比现有星期数大,会返回本周相应星期日期 |
| new_time | 返回某个时间在某时区所对应的在另一个时区的日期,支持参数:date, text, text |
| numtodsinterval | 将数字转换成时间间隔类型的数据。支持参数:double precision, text |
| numtoyminterval | 将数字转换成日期间隔类型的数据。支持参数:double precision,text |
| replace | 替换指定字符串中的字符或删除字符,支持参数:text, text, text/varchar2, varchar2, varchar2 DEFAULT NULL::varchar2 |
| regexp_replace | 用于通过正则表达式来进行匹配替换。支持参数:text, text, text /text, text, text, integer/varchar2, varchar2/varchar2, varchar2 varchar2 |
| regexp_substr | 拾取合符正则表达式描述的字符子串,支持参数:text, text,integer /text, text, integer, integer/ text, text, integer, integer, text /varchar2 ,varchar2 |
| regexp_instr | 用于标定符合正则表达式的字符子串的开始位置,支持参数:text, text,integer /text, text, integer, integer/ text, text, integer, integer, text/text, text, integer, integer, text, integer/ varchar2, varchar2 |
| regexp_like | 与like类似,用于模糊查询。支持参数:varchar2, varchar2 /varchar2, varchar2 varchar2 |
| rtrim | 去除指定字符串的右侧空格 |
| sessiontimezone | 查看时区详细信息 |
| sysdate | 查看对应的日期与时间 |
| systimestamp | 返回本机数据库上当前系统日期和时间(包括微秒和时区) |
| sys_extract_utc | 将一个timestamptz转换为UTC时区时间。支持参数:timestamp with time zone |
| substr | 截取字符串函数,以字符为单位截取,支持参数:text, integer |
| substrb | 截取字符串函数,以字节为单位截取,支持参数:varchar2, number/varchar2, number,number |
| to_char | 将数字或日期转换为字符类型,支持参数:date/date,text/timestamp/timestamp,text |
| to_date | 将字符类型转换为日期类型,支持参数:text/text,text |
| to_dsinterval | 将一个日期加上一定的小时或者天数变成另外一个日期,支持参数:text |
| to_number | 是将一些处理过的按一定格式编排过的字符串变回数值型的格式,支持参数:text/text,text |
| to_multi_byte | 将字符串中的半角字符转换为全角字符 |
| to_single_byte | 将字符串中的半角字符转换为全角字符 |
| to_timestamp | 可以存储年、月、日、小时、分钟、秒,同时还可以存储秒的小数部分。支持参数:text/text,text |
| to_timestamp_tz | 根据时间查询,时间字符串有T,Z并有毫秒,时区 |
| to_yminterval | 将一个字符串类型转化为年和月的时间差类型,支持参数:text |
| trim | 去除指定字符串的左右空格或对应数据,支持参数:varchar2 /varchar2,varchar2 |
| trunc | 可以截取日期,得到想要的数值,如年,月,日,时,分,支持参数:date/date,text |
| tz_offset | 返回给定时区与标准时区的偏移量,支持参数:text |
| uid | 获取数据库的实例名 |
| userenv | 返回当前用户环境的信息 |
用例
add_months函数
查询当前日期的下个月的同一天:
select add_months(sysdate(),1) from dual;
add_months
------------
2026-01-10
(1 row)
查询当前日期的上个月的同一天:
select add_months(sysdate(),-1) from dual;
add_months
------------
2025-11-10
(1 row)
ASCIISTR函数
只有ASCII字符:
select asciistr('Hello, World!') from dual;
asciistr
---------------
Hello, World!
(1 row)
非ASCII字符:
select asciistr('你好') from dual;
asciistr
------------
\4F60\597D
(1 row)
同时包含ASCII字符和非ASCII字符:
select asciistr('ABÄCDE') from dual;
asciistr
------------
AB\00C4CDE
(1 row)
COMPOSE函数
输入基本字符a和组合标记768, 返回法语à
select compose('a'||chr(768)) from dual;
compose
---------
à
(1 row)
current_date函数
查询当前时区的当前日期:
select current_date from dual;
current_date
--------------
2025-12-10
(1 row)
current_timestamp函数
查询当前时区的当前日期与时间:
select current_timestamp from dual;
current_timestamp
-----------------------------------
2025-12-10 15:51:50.992094 +08:00
(1 row)
查询当前时区的当前日期与时间(精度调整为前三位小数):
select current_timestamp(3) from dual;
current_timestamp
-----------------------------------
2025-12-10 15:52:20.206000 +08:00
(1 row)
DECOMPOSE函数
输入法语é,返回基本字符e和组合标记301:
select asciistr(decompose('é')) from dual;
asciistr
----------
e\0301
(1 row)
from_tz函数
将’2000-03-28 08:00:00’, ‘3:00’转换为当前时区:
SELECT FROM_TZ(TIMESTAMP '2000-03-28 08:00:00', '3:00') FROM DUAL;
from_tz
-----------------------------------
2000-03-28 13:00:00.000000 +08:00
(1 row)
hextoraw函数
将字符串’abcdef’转换为raw数值:
select hextoraw('abcdef')from dual;
hextoraw
----------
\xabcdef
(1 row)
instrb函数
返回CORPORATE FLOOR中默认第一次出现OR时字符串的位置:
SELECT INSTRB('CORPORATE FLOOR','OR') "Instring in bytes" FROM DUAL;
Instring in bytes
-------------------
2
(1 row)
返回corporate floor中从第五个字符开始查询,第二次出现or时字符串的位置:
SELECT INSTRB('CORPORATE FLOOR','OR',5,2) "Instring in bytes" FROM DUAL;
Instring in bytes
-------------------
14
(1 row)
last_day函数
查询当天所在月份的最后一天:
select last_day(sysdate())from dual;
last_day
------------
2025-12-31
(1 row)
查询某一天所在月份的最后一天:
select last_day(to_date('2025-01-01')) from dual;
last_day
------------
2025-01-31
(1 row)
length函数
查询223的字符长度:
select length(223) from dual;
length
--------
3
(1 row)
查询’223’的字符长度:
select length('223') from dual;
length
--------
3
(1 row)
查询’UDB-TX数据库’的字符长度:
select length('UDB-TX数据库') from dual;
length
--------
11
(1 row)
lengthb函数
查询’UDB-TX’的字节长度:
select lengthb('UDB-TX'::char) from dual;
lengthb
---------
1
(1 row)
查询’0x2C’的字节长度:
select lengthb('0x2C'::bytea) from dual;
lengthb
---------
4
(1 row)
查询’UDB-TX数据库’的字节长度:
select lengthb('UDB-TX数据库'::varchar2) from dual;
lengthb
---------
17
(1 row)
localtimestamp函数
返回当前会话中的日期和时间:
select localtimestamp from dual;
localtimestamp
----------------------------
2023-07-07 09:18:15.896472
(1 row)
返回当前会话中的日期和时间(精度为1):
select localtimestamp(1) from dual;
localtimestamp
----------------------------
2023-07-07 09:18:16.100000
(1 row)
ltrim函数
去除’ abcdefg ‘的左侧空格:
select ltrim(' abcdefg ')ltrim from dual;
ltrim
------------
abcdefg
(1 row)
从’abcdefg’左侧开始遍历,一旦存在某字符出现在’fegab’中就去除,不存在则返回结果:
select ltrim('abcdefg','fegab')ltrim from dual;
ltrim
-------
cdefg
(1 row)
months_between函数
查询不同月份同一天之间相差的月份:
select months_between(to_date('2025-05-01'),to_date('2025-04-01')) from dual;
months_between
----------------
1
(1 row)
查询不同月份不同日期之间相差的月份:
select months_between(to_date('2025-05-01'),to_date('2025-04-15')) from dual;
months_between
--------------------
0.5483870967741935
(1 row)
next_day函数
查询当前日期的下一天:
select next_day(sysdate(),1) from dual;
next_day
------------
2025-12-14
(1 row)
查询当前日期的下个星期五:
select next_day(sysdate(),'FRIDAY') from dual;
next_day
------------
2025-12-12
(1 row)
new_time函数
返回当前日期在另一个时区对应的日期:
select sysdate() bj_time,new_time(sysdate(),'PDT','GMT')los_angles from dual;
bj_time | los_angles
------------+------------
2025-12-10 | 2025-12-10
(1 row)
numtodsinterval函数
转换100.00个小时为时间间隔类型数据:
SELECT NUMTODSINTERVAL(100.00, 'hour');
numtodsinterval
-------------------------------
+000000004 04:00:00.000000000
(1 row)
转换100分钟为时间间隔类型数据:
SELECT NUMTODSINTERVAL(100, 'minute');
numtodsinterval
-------------------------------
+000000000 01:40:00.000000000
(1 row)
numtoyminterval函数
转换1.00,year为日期间隔:
SELECT NUMTOYMINTERVAL(1.00,'year');
numtoyminterval
-----------------
+000000001-00
(1 row)
转换1,mouth为日期间隔:
SELECT NUMTOYMINTERVAL(1,'month');
numtoyminterval
-----------------
+000000000-01
(1 row)
replace函数
替换’jack and jue’中的’j’为’bl’:
select replace('jack and jue','j','bl') from dual;
replace
----------------
black and blue
(1 row)
删除’jack and jue’中的’j’:
select replace('jack and jue','j') from dual;
replace
------------
ack and ue
(1 row)
regexp_replace函数
将匹配到的数字替换为*#:
select regexp_replace('01234abcd56789','[0-9]','*#')from dual;
regexp_replace
--------------------------
*#*#*#*#*#abcd*#*#*#*#*#
(1 row)
从第二个数开始将匹配到的数字替换为*#:
select regexp_replace('01234abcd56789','[0-9]','*#',2)from dual;
regexp_replace
-------------------------
0*#*#*#*#abcd*#*#*#*#*#
(1 row)
删除’01234abcd56789’中的’01’:
select regexp_replace('01234abcd56789','01')from dual;
regexp_replace
----------------
234abcd56789
(1 row)
用’xxx’替换01234abcd56789’中的012:
select regexp_replace('01234abcd56789','012','xxx')from dual;
regexp_replace
----------------
xxx34abcd56789
(1 row)
regexp_substr函数
查询’012ab34’中从第一个数开始的012字串:
select regexp_substr('012ab34', '012',1) from dual;
regexp_substr
---------------
012
(1 row)
查询’012ab34’中从第一个数第一组开始的012字串:
select regexp_substr('012ab34', '012',1,1) from dual;
regexp_substr
---------------
012
(1 row)
查询’012a012Ab34’中从第一个数第一组开始不区分大小写的012字串:
select regexp_substr('012a012Ab34', '012A',1,1,'i') from dual;
regexp_substr
---------------
012a
(1 row)
查询’012a012Ab34’中从第一个数第一组开始区分大小写的012字串:
select regexp_substr('012a012Ab34', '012A',1,1,'c') from dual;
regexp_substr
---------------
012A
(1 row)
查询’数据库’中 ‘数据’子串:
select regexp_substr('数据库', '数据') from dual;
regexp_substr
---------------
数据
(1 row)
regexp_instr函数
查询’abcaBcabc’中从第一个字符开始,出现abc子串的位置:
SELECT regexp_instr('abcaBcabc', 'abc', 1);
regexp_instr
--------------
1
(1 row)
查询’abcaBcabc’中从第一个字符开始,第三次出现abc子串的位置:
SELECT regexp_instr('abcaBcabc', 'abc', 1, 3);
regexp_instr
--------------
7
(1 row)
查询’abcabcabc’中从第一个字符开始,第二次出现abc子串后发生的位置:
SELECT regexp_instr('abcaBcabc', 'abc', 1, 2,1);
regexp_instr
--------------
7
(1 row)
查询’abcaBcabc’中从第一个字符开始,第一次出现abc子串后发生的位置(区分大小写):
SELECT regexp_instr('abcaBcabc', 'abc',1,2,1,'c');
regexp_instr
--------------
7
(1 row)
查询’数据库’中’库’出现的位置:
SELECT regexp_instr('数据库', '库');
regexp_instr
--------------
3
(1 row)
regexp_like函数
首先创建一个regexp_like表用于测试用例查询:
create table t_regexp_like
(
id varchar(4),
value varchar(10)
);
insert into t_regexp_like values ('1','1234560');
insert into t_regexp_like values ('2','1234560');
insert into t_regexp_like values ('3','1b3b560');
insert into t_regexp_like values ('4','abc');
insert into t_regexp_like values ('5','abcde');
insert into t_regexp_like values ('6','ADREasx');
insert into t_regexp_like values ('7','123 45');
insert into t_regexp_like values ('8','adc de');
insert into t_regexp_like values ('9','adc,.de');
insert into t_regexp_like values ('10','abcbvbnb');
insert into t_regexp_like values ('11','11114560');
查询t_regexp_like表中带有abc的列:
select * from t_regexp_like where regexp_like(value,'abc');
id | value
----+----------
4 | abc
5 | abcde
10 | abcbvbnb
(3 rows)
查询t_regexp_like表中带有ABC的列(不区分大小写):
select * from t_regexp_like where regexp_like(value,'ABC','i');
id | value
----+----------
4 | abc
5 | abcde
10 | abcbvbnb
(3 rows)
rtrim函数
去除’ abcdefg ‘的右侧空格:
select rtrim(' abcdefg ')rtrim from dual;
rtrim
----------------
abcdefg
(1 row)
从’abcdefg’右侧开始遍历,一旦存在某字符出现在’fegab’中就去除,不存在则返回结果:
select rtrim('abcdefg','fegab')rtrim from dual;
rtrim
-------
abcd
(1 row)
sessiontimezone函数
查看当前时区的详细信息:
select sessiontimezone() from dual;
sessiontimezone
-----------------
Asia/Shanghai
(1 row)
修改timezone后,查看时区相信信息:
set timezone to 'Asia/Hong_Kong';
SET
select sessiontimezone() from dual;
sessiontimezone
-----------------
Asia/Hong_Kong
(1 row)
sysdate函数
查询当前系统的日期:
select sysdate() from dual;
sysdate
------------
2025-12-10
(1 row)
查询往前推1天的日期:
select sysdate()-1 from dual;
?column?
------------
2025-12-09
(1 row)
systimestamp函数
查询当前日期的日期和时间:
select systimestamp() from dual;
systimestamp
-----------------------------------
2025-12-10 15:35:12.687348 +08:00
(1 row)
sys_extract_utc函数
查询转换timestamp ‘2000-03-28 11:30:00.00 -8:00’为UTC时区后的时间:
select sys_extract_utc(timestamp '2000-03-28 11:30:00.00 -8:00') from dual;
sys_extract_utc
----------------------------
2000-03-28 19:30:00.000000
(1 row)
substr函数
截取’今天天气很好’中从第五个字符开始,往后的字符串:
SELECT SUBSTR('今天天气很好',5) "Substring with bytes" FROM DUAL;
Substring with bytes
----------------------
很好
(1 row)
substrb函数
截取’今天天气很好’中从第五个字节开始,往后的字符串:
SELECT SUBSTRB('今天天气很好',5) "Substring with bytes" FROM DUAL;
Substring with bytes
----------------------
天气很好
(1 row)
截取’今天天气很好’中从第五个字节开始,第八个字节结束的字符串:
SELECT SUBSTRB('今天天气很好',5,8) "Substring with bytes" FROM DUAL;
Substring with bytes
----------------------
天气
(1 row)
to_char函数
将当前系统日期转换为字符格式:
select to_char(sysdate()) from dual;
to_char
------------
2023-07-10
(1 row)
将当前系统日期转换为月份/日期/年字符格式:
select to_char(sysdate(),'mm/dd/yyyy') from dual;
to_char
------------
07/10/2023
(1 row)
将当前日期的timestamp格式转换为字符格式:
SELECT to_char(sysdate()::timestamp);
to_char
----------------------------
2023-07-10 09:46:44.000000
(1 row)
将当前日期的timestamp格式转换为月份/日期/年字符格式:
SELECT to_char(sysdate()::timestamp,'MM-YYYY-DD');
to_char
------------
07-2023-10
(1 row)
to_date函数
将’2023/07/06’转换为日期类型:
select to_date('20230706') from dual;
to_date
------------
2023-07-06
(1 row)
将’-44-02-01’转换为日期类型:
SELECT to_date('-44,0201','YYYY-MM-DD');
to_date
------------
0044-02-01
(1 row)
to_dsinterval函数
查询当前系统时间加上9个半小时后的日期(当前为2023-07-06,18:00):
select sysdate()+to_dsinterval('0 09:30:00')as newdate from dual;
newdate
------------
2023-07-07
(1 row)
to_number函数
将字符串’-34,338,492’转换为数值型格式:
SELECT to_number('34,338,492', '99,999,999') from dual;
to_number
-----------
-34338492
(1 row)
将字符串’5.01-’转换为数值型格式:
SELECT to_number('5.01-', '9.99S');
to_number
-----------
-5.01
(1 row)
to_multi_byte函数
输入半角字符,转换为全角字符:
select to_multi_byte('1.2'::text) ;
to_multi_byte
---------------
1.2
(1 row)
to_single_byte函数
输入全角字符,转换为半角字符:
select to_single_byte('1.2');
to_single_byte
----------------
1.2
(1 row)
to_timestamp函数
查询’2018-11-02 12:34:56.025’以日期形式输出:
SELECT to_timestamp('20181102.12.34.56.025');
to_timestamp
----------------------------
2018-11-02 12:34:56.025000
(1 row)
查询’2011,12,18 11:38’以日期形式输出:
SELECT to_timestamp('2011,12,18 11:38 ', 'YYYY-MM-DD HH24:MI:SS');
to_timestamp
----------------------------
2011-12-18 11:38:00.000000
(1 row)
to_timestamp_tz函数
查询’2016-10-9 14:10:10.123000’以日期形式输出:
SELECT to_timestamp_tz('2016-10-9 14:10:10.123000') FROM DUAL;
to_timestamp_tz
-----------------------------------
2016-10-09 14:10:10.123000 +08:00
(1 row)
查询’10-9-2016 14:10:10.123000 +8:30’以日期形式输出:
SELECT to_timestamp_tz('10-9-2016 14:10:10.123000 +8:30', 'DD-MM-YYYY HH24:MI:SS.FF TZH:TZM') FROM DUAL;
to_timestamp_tz
-----------------------------------
2016-09-10 13:40:10.123000 +08:00
(1 row)
to_yminterval函数
查询’20110101’以后两个年零八个月后的日期:
select to_date('20110101','yyyymmdd')+to_yminterval('02-08') from dual;
?column?
------------
2013-09-01
(1 row)
trim函数
去除’ aaa bbb ccc ‘的左右空格:
select trim(' aaa bbb ccc ')trim from dual;
trim
-------------
aaa bbb ccc
(1 row)
去除’aaa bbb ccc’中的aaa:
select trim('aaa bbb ccc','aaa')trim from dual;
trim
----------
bbb ccc
(1 row)
trunc函数
截取当前日期:
select trunc(sysdate()) from dual;
trunc
------------
2025-12-10
(1 row)
截取年,返回值只有年是正确的,月和日不是准确值:
select trunc(sysdate(),'yyyy') from dual;
trunc
------------
2025-01-01
(1 row)
截取月,返回值只有月是正确的,年和日不是准确值:
select trunc(sysdate(),'mm') from dual;
trunc
------------
2025-12-01
(1 row)
tz_offset函数
返回给定时区与标准时区偏移量:
select tz_offset('US/Eastern') from dual;
tz_offset
-----------
-05:00
(1 row)
uid函数
获取当前数据库的实例名:
select uid() from dual;
uid
-----
10
(1 row)
userenv函数
查看当前用户是否是dba,如果是返回ture:
select userenv('isdba')from dual;
get_isdba
-----------
TRUE
(1 row)
查看会话标志:
select userenv('sessionid')from dual;
get_sessionid
---------------
1
(1 row)