Oracle函数

Oracle函数

日期函数

获取日期

  • 获取当前日期

    SELECT SYSDATE FROM DUAL;-- 2022-05-18 11:39:26
    SELECT SYSDATE, ADD_MONTHS(SYSDATE, 1) FROM DUAL; -- 2022-05-18 11:39:26,2022-06-18 11:39:2
    SELECT last_day(SYSDATE) FROM DUAL;-- 2022-05-31 11:41:16
    SELECT MONTHS_BETWEEN(TO_DATE('2022-05-18','yyyy-MM-dd'), TO_DATE('2022-02-12','yyyy-MM-dd')) FROM DUAL; -- 3.19354838709677419354838709677419354839
    

    几种时间函数

    **注意:**这里的会话时区,如果你的jdbc连接没有设置时区,那么会话时区默认是utc的,所以不能用这个函数作为插入值使用。

    序号函数名说明
    1DBTIMEZONE数据库时区
    2SESSIONTIMEZONE会话时区
    3CURRENT_DATE当前会话时间
    4CURRENT_TIMESTAMP当前会话时间戳 (带时区)
    5SYSDATE系统时间/系统时间
    6LOCALTIMESTAMP系统时间戳/系统时间戳
    7SYSTIMESTAMP系统时间戳/系统时间戳(带时区)
    -- 查询系统时区和session时区
    SELECT DBTIMEZONE, SESSIONTIMEZONE FROM DUAL;
    -- 设置session时区
    ALTER SESSION SET TIME_ZONE='Asia/Shanghai';
    -- 设置数据库时区
    ALTER DATABASE SET TIME_ZONE ='+08:00';
    
  • ROUND()

    -- 给出日期按期间(参数2)四舍五入后的期间的第一天日期
    SELECT ROUND(SYSDATE) FROM DUAL;   -- 最近0点日期
    SELECT ROUND(SYSDATE,'day') FROM DUAL; -- 最近星期日
    SELECT ROUND(SYSDATE,'month') FROM DUAL; -- 最近月初
    SELECT ROUND(SYSDATE,'q') FROM DUAL; -- 最近季初日期
    SELECT ROUND(SYSDATE,'year') FROM DUAL; -- 最近年初日期
    
  • trunc()

    -- 返回日期所在期间的第一天日期
    SELECT trunc(SYSDATE) FROM DUAL;   -- 最近0点日期
    SELECT trunc(SYSDATE,'day') FROM DUAL; -- 最近星期日
    SELECT trunc(SYSDATE,'month') FROM DUAL; -- 最近月初
    SELECT trunc(SYSDATE,'q') FROM DUAL; -- 最近季初日期
    SELECT trunc(SYSDATE,'year') FROM DUAL; -- 最近年初日期
    
  • next_day

    SELECT next_day(SYSDATE,'星期一') FROM DUAL;--下周星期一
    SELECT next_day(SYSDATE,'星期二') FROM DUAL;--下周星期二
    SELECT next_day(SYSDATE,'星期三') FROM DUAL;--下周星期三
    SELECT next_day(SYSDATE,'星期四') FROM DUAL;--下周星期四
    SELECT next_day(SYSDATE,'星期五') FROM DUAL;--下周星期五
    SELECT next_day(SYSDATE,'星期六') FROM DUAL;--下周星期六
    SELECT next_day(SYSDATE,'星期日') FROM DUAL;--下周星期日
    
  • 2

提取日期

extract
SELECT extract(hour from timestamp '2001-2-16 2:38:40 ' ) FROM DUAL; -- 小时,
SELECT extract(minute from timestamp '2001-2-16 2:38:40 ' ) FROM DUAL; -- 分钟,
SELECT extract(second from timestamp '2001-2-16 2:38:40 ' ) FROM DUAL; -- 秒,
SELECT extract(DAY from timestamp '2001-2-16 2:38:40 ' ) FROM DUAL; -- 日,
SELECT extract(MONTH from timestamp '2001-2-16 2:38:40 ' ) FROM DUAL; -- 月,
SELECT extract(YEAR from timestamp '2001-2-16 2:38:40 ' ) FROM DUAL; -- 年

SELECT extract(DAY from  SYSDATE ) FROM DUAL;
SELECT extract(MONTH from  SYSDATE ) FROM DUAL;
SELECT extract(YEAR from  SYSDATE ) FROM DUAL;

日期计算

  • interval

    -- 数值为负,减xx时间。
    select
            trunc(sysdate)+(interval '1' second), --加1秒(1/24/60/60)
            trunc(sysdate)+(interval '1' minute), --加1分钟(1/24/60)
            trunc(sysdate)+(interval '1' hour), --加1小时(1/24)
            trunc(sysdate)+(INTERVAL '1' DAY),  --加1天(1)
            trunc(sysdate)+(INTERVAL '1' MONTH), --加1月
            trunc(sysdate)+(INTERVAL '1' YEAR), --加1年
            trunc(sysdate)+(interval '01:02:03' hour to second), --加指定小时到秒
            trunc(sysdate)+(interval '01:02' minute to second), --加指定分钟到秒
            trunc(sysdate)+(interval '01:02' hour to minute), --加指定小时到分钟
            trunc(sysdate)+(interval '2 01:02' day to minute) --加指定天数到分钟
    from dual;
    

日期转换

转换函数

TO_CHAR(x[[,c2],C3])

x是一个date或number数据类型。
c2为格式参数
c3为NLS设置参数
如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制返回的月份和日份所使用的语言
如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定小数位千分位的分隔符,以及货币符号。
NLS_NUMERIC_CHARACTERS =“dg”, NLS_CURRENCY=“string”
【说明1】x为数据型时

date/time 转换的模板(常用)
模板描述
HH一天的小时数 (01-12)
HH12一天的小时数 (01-12)
HH24一天的小时数 (00-23)
MI分钟 (00-59)
SS秒 (00-59)
SSSS午夜后的秒 (0-86399)
AM or A.M. or PM or P.M.正午标识(大写)
am or a.m. or pm or p.m.正午标识(小写)
Y,YYY带逗号的年(4 和更多位)
YYYY年(4和更多位)
YYY年的后三位
YY年的后两位
Y年的最后一位
BC or B.C. or AD or A.D.年标识(大写)
bc or b.c. or ad or a.d.年标识(小写)
MONTH全长大写月份名(9字符)
Month全长混合大小写月份名(9字符)
month全长小写月份名(9字符)
MON大写缩写月份名(3字符)
Mon缩写混合大小写月份名(3字符)
mon小写缩写月份名(3字符)
MM月份 (01-12)
DAY全长大写日期名(9字符)
Day全长混合大小写日期名(9字符)
day全长小写日期名(9字符)
DY缩写大写日期名(3字符)
Dy缩写混合大小写日期名(3字符)
dy缩写小写日期名(3字符)
DDD一年里的日子(001-366)
DD一个月里的日子(01-31)
D一周里的日子(1-7;SUN=1)
W一个月里的周数
WW一年里的周数
CC世纪(2 位)
JJulian 日期(自公元前4712年1月1日来的日期)
Q季度
RM罗马数字的月份(I-XII;I=JAN)-大写
rm罗马数字的月份(I-XII;I=JAN)-小写
date/time 转换的模板(官方)
元素TO_* 日期时间函数?描述
- / , . ; : "text" 是的标点符号和引用的文本在结果中重现。
AD A.D. 是的带或不带句点的 AD 指示器。
AM A.M. 是的带或不带句点的子午线指示器。
BC B.C. 是的带或不带句点的 BC 指标。
CC SCC 世纪。如果 4 位数字年份的最后 2 位数字介于 01 和 99(含)之间,则该世纪比该年份的前 2 位数字大 1。如果 4 位数字年份的最后 2 位数字为 00,则世纪与该年份的前 2 位数字相同。例如,2002 返回 21;2000 返回 20。
D 是的星期几 (1-7).此元素取决于会话的 NLS 区域。
DAY是的日期的名称。
DD 是的一个月中的某一天 (1-31)。
DDD 是的一年中的一天 (1-366).
DL 是的返回长日期格式的值,该格式是 Oracle 数据库格式的扩展,由参数的当前值确定。使日期组件(日名、月号等)的外观依赖于 和 参数。例如,在区域设置中,这等效于指定格式 。在区域设置中,它等效于指定格式 ’ '。DATE``NLS_DATE_FORMAT``NLS_TERRITORY``NLS_LANGUAGE``AMERICAN_AMERICA``'fmDay,``Month``dd,``yyyy'``GERMAN_GERMANY``fmDay, dd.``Month yyyy**限制:**只能使用元素指定此格式,以空格分隔。TS
DS 是的返回短日期格式的值。使日期组件(日名、月号等)的外观依赖于 和 参数。例如,在区域设置中,这等效于指定格式“”。在区域设置中,它等效于指定格式 ‘’。NLS_TERRITORY``NLS_LANGUAGE``AMERICAN_AMERICA``MM/DD/RRRR``ENGLISH_UNITED_KINGDOM``DD/MM/RRRR**限制:**只能使用元素指定此格式,以空格分隔。TS
DY 是的日期的缩写名称。
E 是的缩写的年号(日本帝国,中华民国官方和泰国佛历)。
EE 是的全名(日本帝国,中华民国官员和泰国佛历)。
FF [1..9] 是的秒的小数部分;不打印基数字符。使用 X 格式元素添加基数字符。使用 FF 后面的数字 1 到 9 指定返回的日期时间值的小数秒部分中的位数。如果未指定数字,则 Oracle 数据库将使用为日期时间数据类型或数据类型的默认精度指定的精度。在时间戳和间隔格式中有效,但在格式中无效。DATE例子: 'HH:MI:SS.FF'``SELECT TO_CHAR(SYSTIMESTAMP, 'SS.FF3') from DUAL;
FM 是的返回一个没有前导空格或尾随空格的值。参见FM
FX 是的要求字符数据和格式模型之间精确匹配。参见外汇
HH HH12 是的一天中的一小时 (1-12)。
HH24 是的一天中的一小时 (0-23)。
IW 日历周(1-52 或 1-53),由 ISO 8601 标准定义。日历周从星期一开始。一年中的第一个日历周包括 1 月 4 日。一年中的第一个日历周可能包括12月29日,30日和31日。一年中的最后一个日历周可能包括 1 月 1 日、2 日和 3 日。
IYYY 包含日历周的年份的 4 位数年份,如 ISO 8601 标准所定义。
IYY IY I 包含 ISO 8601 标准定义的日历周的年份的最后 3、2 或 1 位数字。
J 是的儒略日;自公元前4712年1月1日以来的天数。用 J 指定的数字必须是整数。
MI 是的分钟 (0-59)。
MM 是的月份 (01-12;1 月 = 01)。
MON 是的月份的缩写名称。
MONTH 是的月份名称。
PM P.M. 是的带或不带句点的子午线指示器。
Q 季度 (1, 2, 3, 4;1 月至 3 月 = 1)。
RM 是的罗马数字月 (I-XII;1 月 = I)。
RR 是的允许您仅使用两位数字存储 21 世纪的 20 世纪日期。另请参见**:**“RR 日期时间格式元素”
RRRR 是的全年无休。接受 4 位或 2 位输入。如果为 2 位数字,则提供与 RR 相同的回报。如果您不需要此功能,请输入 4 位数的年份。
SS 是的第二(0-59)。
SSSSS 是的午夜过后几秒钟 (0-86399)。
TS 是的返回短时间格式的值。使时间分量(小时、分钟等)的外观依赖于 和 初始化参数。NLS_TERRITORY``NLS_LANGUAGE**限制:**只能使用 or 元素指定此格式,以空格分隔。DL``DS
TZD 是的夏令时信息。TZD 值是包含夏令时信息的缩写时区字符串。它必须与 TZR 中指定的区域相对应。在时间戳和间隔格式中有效,但在格式中无效。DATE示例:(适用于美国/太平洋标准时间); (适用于美国/太平洋夏令时)。PST``PDT
TZH 是的时区小时。(请参阅格式元素。在时间戳和间隔格式中有效,但在格式中无效。TZM``DATE示例:.'HH:MI:SS.FFTZH:TZM'
TZM 是的时区分钟。(请参阅格式元素。在时间戳和间隔格式中有效,但在格式中无效。TZH``DATE示例:.'HH:MI:SS.FFTZH:TZM'
TZR 是的时区区域信息。该值必须是数据库中支持的时区区域名称之一。在时间戳和间隔格式中有效,但在格式中无效。DATE**例:**美国/太平洋
WW 一年中的第一周 (1-53),其中第 1 周从一年的第一天开始,一直持续到一年中的第七天。
W 月中的一周 (1-5),其中第 1 周从该月的第一天开始,到第七天结束。
X 是的局部基数字符。示例:.'HH:MI:SSXFF'
Y,YYY 是的此位置带有逗号的年份。
YEAR SYEAR 年份,拼写出来; 前缀 BC 日期,并带有减号 (-)。S
YYYY SYYYY 是的4位数字年份; 用减号前缀 BC 日期。S
YYY YY Y 是的年份的最后 3、2 或 1 位数字。

Oracle 数据库可以灵活地将字符串转换为日期。例如,当使用该函数时,包含标点符号字符的格式模型与缺少部分或全部这些字符的输入字符串匹配,前提是输入字符串中的每个数字元素都包含允许的最大位数,例如,两位数字“05”表示“MM”,四位数字“2007”表示“YYYY”。以下语句不返回错误:TO_DATE

SELECT TO_CHAR(TO_DATE('0207','MM/YY'), 'MM/YY') FROM DUAL;

TO_CH
-----
02/07
 

但是,以下格式字符串确实返回错误,因为 FX(格式精确)格式修饰符要求表达式和格式字符串完全匹配:

SELECT TO_CHAR(TO_DATE('0207', 'fxmm/yy'), 'mm/yy') FROM DUAL;
SELECT TO_CHAR(TO_DATE('0207', 'fxmm/yy'), 'mm/yy') FROM DUAL;
                       *
ERROR at line 1:
ORA-01861: literal does not match format string

允许任何非字母数字字符与格式模型中的标点符号字符匹配。例如,以下语句不返回错误:

SELECT TO_CHAR (TO_DATE('02#07','MM/YY'), 'MM/YY') FROM DUAL;

TO_CH
-----
02/07

所有模板都都允许使用前缀和后缀修改器。模板里总是允许使用修改器。前缀 ‘FX’ 只是一个全局修改器。

date/time to_char() 的前缀后缀
后缀描述例子
FM填充模式前缀FMMonth
TH大写顺序数后缀DDTH
th小写顺序数后缀DDTH
FX固定模式全局选项(见下面)FX Month DD Day
SP拼写模式(还未实现)DDSP

用法须知:

  • 如果没有使用 FX 选项,to_timestampto_date 忽略空白。FX 必须做为模板里的第一个条目声明。
  • 反斜杠(“”)必须用做双反斜杠(“\”),例如 ‘\HH\MI\SS’。
  • 双引号(‘"’)之间的字串被忽略并且不被分析。如果你想向输出写双引号,你必须在双引号前面放置一个双反斜杠('\\'),例如 '\\"YYYY Month\\"'
  • **to_char** 支持不带前导双引号(‘"’)的文本,但是在双引号之间的任何字串会被迅速处理并且还保证不会被当作模板关键字解释(例如:'"Hello Year: "YYYY')。
to_char(numeric) 的模板(常用)
模板描述
9带有指定位数的值
0前导零的值
. (句点)小数
, (逗号)分组(千)分隔符
PR尖括号内负值
S带负号的负值(使用本地化)
L货币符号(使用本地化)
D小数点(使用本地化)
G分组分隔符(使用本地化)
MI在指明的位置的负号(如果数字 < 0)
PL在指明的位置的正号(如果数字 > 0)
SG在指明的位置的正/负号
RN罗马数字(输入在 1 和 3999 之间)
TH or th转换成序数
V移动 n 位(小数)(参阅注解)
EEEE科学记数。现在不支持。
to_char(numeric) 的模板(官方)

表 2-13 数字格式元素

元素描述
(逗号)9,999返回指定位置的逗号。您可以在数字格式模型中指定多个逗号。**限制:**逗号元素不能开始数字格式模型。在数字格式模型中,逗号不能出现在十进制字符或句点的右侧。
.(句点)99.99返回一个小数点,即指定位置的句点 (.)。**限制:**在数字格式模型中只能指定一个周期。
$$9999返回带有前导美元符号的值。
00999``9990返回前导零。返回尾随零。
99999返回具有指定位数的值,如果为正,则前导空格;如果为负,则为前导减号。前导零为空,但零值除外,零值返回定点数的整数部分的零。
BB9999当定点数的整数部分为零时,返回该整数部分的空白(与格式模型中的零无关)。
CC999在指定位置返回 ISO 货币符号(参数的当前值)。NLS_ISO_CURRENCY
D99D99在指定位置返回十进制字符,该字符是参数的当前值。默认值为句点 (.)。NLS_NUMERIC_CHARACTER**限制:**在数字格式模型中只能指定一个小数字符。
断续器9.9EEEE返回使用科学记数法的值。
G9G999在指定位置返回组分隔符(参数的当前值)。您可以在数字格式模型中指定多个组分隔符。NLS_NUMERIC_CHARACTER**限制:**在数字格式模型中,组分隔符不能显示在小数点字符或句点的右侧。
LL999在指定位置返回本地货币符号(参数的当前值)。NLS_CURRENCY
9999MI返回带有尾随减号 (-) 的负值。返回尾随空白的正值。**限制:**MI 格式元素只能出现在数字格式模型的最后一个位置。
公关9999PR返回<角括号>中的负值。返回具有前导和尾随空白的正值。Restriction: The PR format element can appear only in the last position of a number format model.
断续器rnRN``rn返回大写罗马数字形式的值。以小写罗马数字的形式返回一个值。值可以是介于 1 和 3999 之间的整数。
SS9999``9999S返回带有前导减号 (-) 的负值。返回带有前导加号 (+) 的正值。返回带有尾随减号 (-) 的负值。返回带有尾随加号 (+) 的正值。**限制:**S 格式元素只能出现在数字格式模型的第一个或最后一个位置。
断续器TM文本最小数字格式模型返回(以十进制输出)可能最少的字符数。此元素不区分大小写。默认值为 TM9,它以固定表示法返回数字,除非输出超过 64 个字符。如果输出超过 64 个字符,则 Oracle 数据库会自动返回科学记数法中的数字。**限制:**不能在此元素前面加上任何其他元素。您只能将此元素跟在一个 9 或一个 E(或 e)后面,但不能使用它们的任意组合。以下语句返回错误:SELECT TO_CHAR(1234, 'TM9e') FROM DUAL;
UU9999在指定位置返回欧元(或其他)双货币符号,由参数的当前值确定。NLS_DUAL_CURRENCY
V999V99返回一个值乘以 10n(如有必要,请将其向上舍入),其中 .n``V
XXXXX``xxxx返回指定位数的十六进制值。如果指定的数字不是整数,则 Oracle 数据库会将其舍入为整数。**限制:**此元素仅接受正值或 0。负值返回错误。只能在此元素前面加上 0(返回前导零)或 FM。任何其他元素都会返回错误。如果既不指定 0 也不指定带有 X 的 FM,则返回值始终有一个前导空白。有关详细信息,请参阅格式模型修饰符 FM

表 2-14 显示了以下查询的结果,用于和 的不同值:number``'fmt'

SELECT TO_CHAR(number, 'fmt')  FROM DUAL;

表2-14 数字转换结果

‘fmt’结果
-12345678909999999999S'1234567890-'
099.99' .00'
+0.199.99' .10'
-0.299.99' -.20'
090.99' 0.00'
+0.190.99' 0.10'
-0.290.99' -0.20'
09999' 0'
19999' 1'
0B9999' '
1B9999' 1'
0B90.99' '
+123.456999.999' 123.456'
-123.456999.999'-123.456'
+123.456FM999.009'123.456'
+123.4569.9EEEE' 1.2E+02'
+1E+1239.9EEEE' 1.0E+123'
+123.456FM9.9EEEE'1.2E+02'
+123.45FM999.009'123.45'
+123.0FM999.009'123.00'
+123.45L999.99' $123.45'
+123.45FML999.99'$123.45'
+12345678909999999999S'1234567890+'

to_date()

select to_date('202205','yyyymm'),
       to_date('2022-05-18','yyyy.mm.dd'),
       (date '2022-05-18'),
       to_date('2022-05-18 17:48:57','yyyy-mm-dd hh24:mi:ss'),
       (timestamp '2022-05-18 17:48:57') 
from dual;

TO_NUMBER(X[[,c2],c3])

select TO_NUMBER('22333'),TO_NUMBER('22333.012') from dual;

convert字符集转换

SELECT CONVERT('strutz', 'US7ASCII', 'WE8ISO8859P1')FROM dual;
字符集描述
US7ASCII美国7位ASCII字符集
WE8DEC西欧8位字符集
WE8HP惠普西欧Laserjet 8位字符集
F7DECDEC法语7位字符集
WE8EBCDIC500IBM西欧EBCDIC代码第500页
WE8PC850IBM PC代码第850页
WE8ISO8859P1ISO 8859-1西欧8位字符集

字符串函数

函数注释
ASCII(X)返回字符X的ASCII码
CONCAT(X,Y)连接字符串X和Y
INSTR(X,STR[,START][,N)从X中查找str,可以指定从start开始,也可以指定从n开始
LENGTH(X)返回X的长度
LOWER(X)X转换成小写
UPPER(X)X转换成大写
LTRIM(X[,TRIM_STR])把X的左边截去trim_str字符串,缺省截去空格
RTRIM(X[,TRIM_STR])把X的右边截去trim_str字符串,缺省截去空格
TRIM([TRIM_STR FROM]X)把X的两边截去trim_str字符串,缺省截去空格
REPLACE(X,old,new)在X中查找old,并替换成new
SUBSTR(X,start[,length])返回X的字串,从start处开始,截取length个字符,缺省length,默认到结尾

数值函数

函数说明演示
ABS(X)X的绝对值ABS(-3)=3
ACOS(X)X的反余弦ACOS(1)=0
COS(X)余弦COS(1)=0.54030230586814
CEIL(X)大于或等于X的最小值CEIL(5.4)=6
FLOOR(X)小于或等于X的最大值FLOOR(5.8)=5
LOG(X,Y)X为底Y的对数LOG(2,4)=2
MOD(X,Y)X除以Y的余数MOD(8,3)=2
POWER(X,Y)X的Y次幂POWER(2,3)=8
ROUND(X[,Y])X在第Y位四舍五入,默认y=0ROUND(3.456,2)=3.46
SQRT(X)X的平方根SQRT(4)=2
TRUNC(X[,Y])X在第Y位截断,默认y=0TRUNC(3.456,2)=3.45
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值