首页 > 数据库 >Oracle时间相关函数

Oracle时间相关函数

时间:2023-03-03 10:47:12浏览次数:53  
标签:sysdate 函数 -- dd yyyy dual Oracle 相关 select

Oracle时间相关函数

1、获取当前时间

select sysdate from dual;

2、日期格式

以2023-03-02 17:09:23 为例

格式 类型 名称 示例
年(Year) yy two digits 两位年 显示23
yyy three digits 三位年 显示023
yyyy four digits 四位年 显示2023
月(Month) mm number 两位月 显示03
mon abbreviated 字符集表示 显示3月(若是英文版,显示Mar)
month spelled out 字符集表示 显示3月(若是英文版,显示March)
日(Day) dd number 当月第几天 显示02
ddd number 当年第几天 显示061
dy abbreviated 当周第几天缩写 显示星期四,若是英文版显示Thur
day spelled out 当周第几天全写 显示星期三,若是英语显示Thursday
d number 当周第几天,返回数字 显示5, 每周第1天是星期天
ddspth spelled out 当月第几天(英文显示) 显示second
Hour(时) hh two digits 12小时制 显示05
hh24 two digits 24小时制 显示17
Minute(分) mi two digits 60进制 显示09
Second(秒) ss two digits 60进制 显示23
Quarter(季度) Q digit 季度 显示1
当年第几周 WW digit 当年第几周(从年的第一天算7天为一周) 显示09
IW digit 年的自然周 显示09
当月第几周 W digit 当月第几周 显示1

注意:

  1. WW 是从年的第一天算7天为一周,IW是自然周算的,可以看如下代码:

    select to_char(to_date('2023-03-05','yyyy-mm-dd'),'IW')  from dual;  --09
     
    select to_char(to_date('2023-03-05','yyyy-mm-dd'),'WW')  from dual;  --10
    

    24小时格式下时间范围为: 0:00:00 - 23:59:59....
    12小时格式下时间范围为: 1:00:00 - 12:59:59....

  2. 一周内的第几天:D 每星期的第1天是 星期日

  3. 按周,月,季度,年分组的写法

    --按周分组:自然周 和 年的第一天算7天为一周
    select to_char(时间字段,'yyyy-IW'),其他字段 from 操作表 group by to_char(时间字段,'yyyy-IW');
    select to_char(时间字段,'yyyy-WW'),其他字段 from 操作表 group by to_char(时间字段,'yyyy-WW');
    
    --按月份分组
    select to_char(时间字段,'yyyy-mm'),其他字段 from 操作表 group by to_char(时间字段,'yyyy-mm');
    
    --按季度分组
    select to_char(时间字段,'yyyy-Q'),其他字段 from 操作表 group by to_char(时间字段,'yyyy-Q');
    
    --按年分组
    select to_char(时间字段,'yyyy'),其他字段 from 操作表 group by to_char(时间字段,'yyyy');
    

3、日期类型和字符类型转换函数

3.1、to_char

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual;   //日期转化为字符串   
select to_char(sysdate,'yyyy') as nowYear   from dual;   //获取时间的年   
select to_char(sysdate,'mm')    as nowMonth from dual;   //获取时间的月   
select to_char(sysdate,'dd')    as nowDay    from dual;   //获取时间的日   
select to_char(sysdate,'hh24') as nowHour   from dual;   //获取时间的时   
select to_char(sysdate,'mi')    as nowMinute from dual;   //获取时间的分   
select to_char(sysdate,'ss')    as nowSecond from dual;   //获取时间的秒

3.2、to_date

select to_date('2023-03-05 17:09:23','yyyy-mm-dd hh24:mi:ss') time from dual; --2023-03-05 17:09:23

注意: to_date就要求转换的格式要和输入的字符型日期要对应,不然会报错,如下:

请添加图片描述

这里是因为少了时分秒的缘故。

3.3、NEXT_DAY(X,Y)

X:用于计算的时间

Y: 一个字符串,表示用当前会话语言表示的一周中某一天的全称(如星期一、星期二等),也可以是数值

select NEXT_DAY(to_date('2023-03-02','yyyy-MM-dd'),'星期三') nextDay from dual;  --2023-03-08
select NEXT_DAY(to_date('2023-03-02','yyyy-MM-dd'),3) nextDay from dual;  --2023-03-07 

注意:每星期的第1天是 星期日

3.4、 TRUNC(X [,FORMAT])

截断日期,返回的是日期, FORMAT 中与周相关的有D,IW,WW,W,FMWW

--取周的开始时间和结束时间
SELECT TRUNC(TO_DATE('2023-03-02','YYYY-MM-DD'),'IW') AS STARTDATE FROM DUAL; --本周周一
SELECT TRUNC(TO_DATE('2023-03-02','YYYY-MM-DD'),'IW') + 6 AS ENDDATE FROM DUAL; --本周周日
 
SELECT TRUNC(TO_DATE('2023-03-02','YYYY-MM-DD'),'IW') - 7 AS STARTDATE FROM DUAL;--上周周一   
SELECT TRUNC(TO_DATE('2023-03-02','YYYY-MM-DD'),'IW') - 1  AS ENDDATE FROM DUAL;--上周周日

3.5、 EXTRACT()

参考文章:https://www.cnblogs.com/xqzt/p/4477239.html

从一个date或者interval类型中截取到特定的部分

extract (    
 
        { year | month | day | hour | minute | second }    
 
        | { timezone_hour | timezone_minute }    
 
        | { timezone_region | timezone_abbr }    
 
from { date_value | interval_value } )

只可以从一个date类型中截取年月日

select  extract (year from sysdate) year, extract (month from sysdate) month, extract (day from sysdate) day from  dual;

YEAR      MONTH        DAY
------ ---------- ----------
2023         3           2

从timestamp中获取年月日时分秒

select 
 extract(year from systimestamp) year
,extract(month from systimestamp) month
,extract(day from systimestamp) day
,extract(minute from systimestamp) minute
,extract(second from systimestamp) second
,extract(timezone_hour from systimestamp) th
,extract(timezone_minute from systimestamp) tm
,extract(timezone_region from systimestamp) tr
,extract(timezone_abbr from systimestamp) ta
from dual

请添加图片描述

4、时间差

4.1、年份差(相差月数/12)

select ((months_between(TO_DATE('2018-5-31','yyyy-mm-dd hh24:mi:ss'),TO_DATE('2016-5-31','yyyy-mm-dd hh24:mi:ss')))/12)
As 相差年份 from dual;
--结果:2 

select trunc(months_between(sysdate, to_date('2017-01-01','yyyy-mm-dd')) / 12) As 相差年份 from dual;
--结果:6

SELECT EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM TO_DATE('2017-01-01','YYYY-MM-DD')) As 相差年份 YEARS FROM DUAL;
--结果:6

4.2、月数差(months_between()函数)

--oracle两个日期的相差月数--
--1)月份都是最后一天,A日期 > B日期 ,返回整数 ---
select months_between(TO_DATE('2018-6-30','yyyy-mm-dd hh24:mi:ss'),TO_DATE('2018-5-31','yyyy-mm-dd hh24:mi:ss'))
As 相差月份1 from dual;  --返结果:1
 
--2)月份都是最后一天,B日期 > A日期 ,返回负数 ---
select months_between(TO_DATE('2018-4-30','yyyy-mm-dd hh24:mi:ss'),TO_DATE('2018-5-31','yyyy-mm-dd hh24:mi:ss'))
As 相差月份2 from dual;  --f返回结果:-1
 
--3)月份天数不一样,A日期 > B日期 ,返回带小数的数字---
select months_between(TO_DATE('2018-6-25','yyyy-mm-dd hh24:mi:ss'),TO_DATE('2018-5-31','yyyy-mm-dd hh24:mi:ss'))
As 相差月份3 from dual;  --返回结果:0.8064516...

4.3、相差天数(两个日期相减,并用to_number()函数)

--Oracle中两个日期相差天数--
select TO_NUMBER(TO_DATE('2023-3-2','yyyy-mm-dd hh24:mi:ss')- TO_DATE('1999-7-15','yyyy-mm-dd hh24:mi:ss'))
AS 相差天数 from dual; --8631

4.4、相差小时数,分钟数,秒数(时制进行转换)

--Oracle中两个日期相差小时数--
select TO_NUMBER((TO_DATE('2018-6-5','yyyy-mm-dd hh24:mi:ss')- TO_DATE('2018-5-31','yyyy-mm-dd hh24:mi:ss'))*24)
AS 相差小时数 from dual;
 
--Oracle中两个日期相差分钟数--
select TO_NUMBER((TO_DATE('2018-6-5','yyyy-mm-dd hh24:mi:ss')- TO_DATE('2018-5-31','yyyy-mm-dd hh24:mi:ss'))*24*60)
AS 相差分钟数 from dual;
 
--Oracle中两个日期相差秒数--
select TO_NUMBER((TO_DATE('2018-6-5','yyyy-mm-dd hh24:mi:ss')- TO_DATE('2018-5-31','yyyy-mm-dd hh24:mi:ss'))*24*60*60)
AS 相差秒数 from dual;

4.5、日期加减法

在Oralce中我发现有add_months函数,加天数N可以用如下方法实现,select sysdate+N from dual;

sysdate+1 加一天
sysdate+1/24 加1小时
sysdate+1/(2460) 加1分钟
sysdate+1/(24
60*60) 加1秒钟
类推至毫秒0.001秒

加法

select sysdate,add_months(sysdate,12) from dual;        --加1年 
select sysdate,add_months(sysdate,1) from dual;        --加1月 
select sysdate,to_char(sysdate+7,'yyyy-mm-dd HH24:MI:SS') from dual;  --加1星期 
select sysdate,to_char(sysdate+1,'yyyy-mm-dd HH24:MI:SS') from dual;  --加1天 
select sysdate,to_char(sysdate+1/24,'yyyy-mm-dd HH24:MI:SS') from dual;  --加1小时 
select sysdate,to_char(sysdate+1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual;  --加1分钟 
select sysdate,to_char(sysdate+1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual;  --加1秒 

减法

select sysdate,add_months(sysdate,-12) from dual;        --减1年 
select sysdate,add_months(sysdate,-1) from dual;        --减1月 
select sysdate,to_char(sysdate-7,'yyyy-mm-dd HH24:MI:SS') from dual;  --减1星期 
select sysdate,to_char(sysdate-1,'yyyy-mm-dd HH24:MI:SS') from dual;  --减1天 
select sysdate,to_char(sysdate-1/24,'yyyy-mm-dd HH24:MI:SS') from dual;  --减1小时 
select sysdate,to_char(sysdate-1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual;  --减1分钟 
select sysdate,to_char(sysdate-1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual;  --减1秒

4.6、获取两个日期之间的时间间隔,extract()函数是最好的选择

select
extract (day from dt2 - dt1) day,
extract (hour from dt2 - dt1) hour,
extract (minute from dt2 - dt1) minute,
extract (second from dt2 - dt1) second
from
(
select
to_timestamp ('2023-02-04 15:07:00','yyyy-mm-dd hh24:mi:ss') dt1,
to_timestamp ('2023-05-17 19:08:46','yyyy-mm-dd hh24:mi:ss') dt2
from
dual
)

请添加图片描述

4.7、获取日期中最晚的一个

 select greatest('2023-01-01','2023-03-08','2022-10-01') from dual; --2023-03-08

4.8、查找月的第一天,最后一天

SELECT Trunc(Trunc(SYSDATE, 'MONTH') - 1, 'MONTH') First_Day_Last_Month,
 Trunc(SYSDATE, 'MONTH') - 1 / 86400 Last_Day_Last_Month,
 Trunc(SYSDATE, 'MONTH') First_Day_Cur_Month,
 LAST_DAY(Trunc(SYSDATE, 'MONTH')) + 1 - 1 / 86400 Last_Day_Cur_Month
FROM dual;

请添加图片描述


随笔:在你犹豫的时候,你先穿上跑鞋下楼,这样当你还没做好决定的时候,可能已经跑完回来了。

标签:sysdate,函数,--,dd,yyyy,dual,Oracle,相关,select
From: https://www.cnblogs.com/tanggoblin/p/17174713.html

相关文章

  • 180205 Keras回调函数Callback举例
    调用LambdaCallback调用History自定义Callback类+调用tensorboard的程序结果runfile('F:/180204/NoisyLabelCode/noisy_labels27Code/mnist-mlp.py',wdir='F:/180204/Noi......
  • PHP 常见字符串函数
    1、字符串格式化1、trim():删除字符串两端的空格或其他预定义字符2、rtrim():删除字符串右边的空格或其他预定义字符3、ltrim():删除字符串左边的空格或其他预定义......
  • 农村高中生源转型期提升学生二次函数建模能力的课堂探究
        建模思想的渗透要注意一直持续下去,不能够出现口头学习问题,否则无法从根本上有效锻炼及发展高中生的数学建模能力。而在帮助学生巩固数学建模思想运用过程中可以......
  • 类相关函数(反射机制)
    6.5类相关函数(反射机制)在Python中使用反射可以得到对象的属性,即:反过来让对象告诉我们他的相关信息是什么,用于实现在运行时获取对象的相关信息。Python中有几个内置......
  • 使用qsort函数实现冒泡排序(函数指针的运用)
    //此程序的本质:完全理解qsort函数的传参的原则////实现思路:因为我们是模拟qsort函数//所以我们要自己创造一个:比较数据的函数:cmp_int//因此必须有一个函数指针来接收这......
  • 字符串和字符串函数(二)
    2.字符串输入如果要把一个字符串读入程序,必须先预留存储该字符串的空间,然后用输入函数获取该字符串。2.1分配空间预先分配空间则意味着必须为字符串分配足够使用的空间大小,......
  • 【算法设计-查找】查找的相关题目
    目录1.打印极值点下标2.找最小数3.查找4.找位置1.打印极值点下标【描述】在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻的整数,或者小于所有它相邻的整数......
  • 对于架构相关书籍的读后感
    今天在课上阅读了老师所给的几本书籍,其中对于《大型网站技术架构:核心原理与案例分析》这部书阅读最为详细。此书从多个层面说明了如何构建一个高可用、高性能,高可扩展性的......
  • 上传相关必备知识点 `<input type="file">`
    上传相关知识点<inputtype="file">带有type="file"的<input>元素允许用户可以从他们的设备中选择一个或多个文件。选择后,这些文件可以使用提交表单的方式上传到服......
  • Oracle存储过程 Call使用
    在Oracle中,可以将存储过程(PROCEDURE)定义在一个包(PACKAGE)中。要调用包中的存储过程,需要使用包名和存储过程名来引用它们。以下是一个示例:假设我们有一个名为my_package......