oracle 日期

日期加减

Oracle中日期进行加减可以使用多种方式,以下介绍三种

一种是针对天的操作,适用于对日,时,分,秒的操作,

一种是对月的操作,适用于月,年的操作,

一种是使用INTERVAL函数,适用于年,月,日,时,分,秒的操作

直接加减数字

  • 加一天
sql 复制代码
select sysdate "当前时间",sysdate+1 "当前时间加一天" from dual ;

结果:

2023-11-02 17:09:46	|	2023-11-03 17:09:46

灵活使用

sql 复制代码
SELECT
    SYSDATE "当前时间",
    SYSDATE + 1 "加一天",
    SYSDATE + (1 / 24) "加一小时",
    SYSDATE + (1 / 24 / 60) "加一分钟",
    SYSDATE + (1 / 24 / 60 / 60) "加一秒钟",
    SYSDATE - 1 "减一天"
FROM
    dual;

结果:

2023-11-02 17:14:41	|	2023-11-03 17:14:41	|	2023-11-02 18:14:41	|	2023-11-02 17:15:41	|	2023-11-02 17:14:42	|	2023-11-01 17:14:41

通过ADD_MONTHS()函数

  • 加一个月
sql 复制代码
select sysdate "当前时间",ADD_MONTHS(sysdate, 1) "加一月" from dual ;

结果

2023-11-02 17:18:31	|	2023-12-02 17:18:31

灵活使用

sql 复制代码
SELECT
    SYSDATE "当前时间",
    ADD_MONTHS (SYSDATE, 1) "加一月",
    ADD_MONTHS (SYSDATE, - 1) "减一月",
    ADD_MONTHS (SYSDATE, 1 * 12) "加一年",
    ADD_MONTHS (SYSDATE, - 1 * 12) "减一年"
FROM
    dual;

结果:

2023-11-02 17:20:09	2023-12-02 17:20:09	2023-10-02 17:20:09	2024-11-02 17:20:09	2022-11-02 17:20:09

使用INTERVAL函数

语法:INTERVAL '时间差数值' { YEAR | MONTH | DAY | HOUR | MINUTE | SECODE} (精度数值)

得出的是相应类型的时间差,注意精度数值范围是1-9,不写默认值是2,精度不匹配时间差数值会报错

例如:当前时间加1,11,111年

sql 复制代码
SELECT
    SYSDATE "当前时间",
    SYSDATE + INTERVAL '1' YEAR "加1年",          -- 精度数值不写时是默认两位,此处可以写精度为1-9
    SYSDATE + INTERVAL '11' YEAR "加11年",        -- 此处可以不写,可以是1-9
    SYSDATE + INTERVAL '11' YEAR(2) "加11年",     -- 可以写2-9
    SYSDATE + INTERVAL '111' YEAR(3) "加111年",   -- 此处必须写精度,精度值3-9
    SYSDATE + INTERVAL '111' YEAR (9) "加111年"   -- 精度值可以大于当前精度,不能小于当前数值精度,不能超过9
FROM
    dual;

结果:

2023-11-02 17:22:22	2024-11-02 17:22:22	2034-11-02 17:22:22	2034-11-02 17:22:22	2134-11-02 17:22:22	2134-11-02 17:22:22

灵活运用

sql 复制代码
SELECT
    SYSDATE "当前时间",
    SYSDATE + INTERVAL '1' YEAR "加一年",
    SYSDATE + INTERVAL '-1' YEAR "减一年",
    SYSDATE + INTERVAL '1' MONTH "加一月",
    SYSDATE + INTERVAL '1' DAY "加一天",
    SYSDATE + INTERVAL '1' HOUR "加一小时",
    SYSDATE + INTERVAL '1' MINUTE "加一分钟",
    SYSDATE + INTERVAL '1' SECOND "加一秒"
FROM
    dual;

结果

2023-11-02 17:25:31	2024-11-02 17:25:31	2022-11-02 17:25:31	2023-12-02 17:25:31	2023-11-03 17:25:31	2023-11-02 18:25:31	2023-11-02 17:26:31	2023-11-02 17:25:32

精度的使用同上,当然oracle数据库对于时间大小也是有限制的,年份范围是 -4713 和 +9999 之间, 且不为 0

计算两个日期间隔的天数、月数和年数

天数

在Oracle中,两个日期直接相减,便可以得到天数;

sql 复制代码
select to_date('08/06/2015','mm/dd/yyyy')-to_date('07/01/2015','mm/dd/yyyy') from dual;

返回结果:36

月数

计算月数,需要用到months_between函数;

sql 复制代码
--months_between(date1,date2)   
--如果两个日期中"日"相同,或分别是所在月的最后一天,那么返回的结果是整数。否则,返回的结果将包含一个分数部分(以31天为一月计算)     
select months_between(to_date('01/31/2015','mm/dd/yyyy'),to_date('12/31/2014','mm/dd/yyyy')) "MONTHS" FROM DUAL;      
返回结果: 1    

select months_between(to_date('01/01/2015','mm/dd/yyyy'),to_date('12/31/2014','mm/dd/yyyy')) "MONTHS" FROM DUAL;      
返回结果: 0.032258064516129
sql 复制代码
select abs(trunc(months_between(sysdate , to_date('01/31/2015','mm/dd/yyyy'))))from dual;
select ceil(trunc(months_between(sysdate , to_date('01/31/2015','mm/dd/yyyy'))))from dual;
select floor(trunc(months_between(sysdate , to_date('01/31/2015','mm/dd/yyyy'))))from dual;

年数

计算年数,是通过计算出月数,然后再除以12;(也许会有更好的办法,目前还不知道)

sql 复制代码
select trunc(months_between(to_date('08/06/2015','mm/dd/yyyy'),to_date('08/06/2013','mm/dd/yyyy'))/12) from dual;

--返回结果:2

相差小时数、分钟数、秒数

Oracle中两个日期相差小时数

sql 复制代码
select TO_NUMBER((TO_DATE('2018-6-5 12:00:00','yyyy-mm-dd hh24:mi:ss')- TO_DATE('2018-6-4 00:00:00','yyyy-mm-dd hh24:mi:ss'))*24) AS 相差小时数 from dual;

Oracle中两个日期相差分钟数

sql 复制代码
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中两个日期相差秒数

sql 复制代码
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;
相关推荐
dingdingfish7 分钟前
JSON 系列之1:将 JSON 数据存储在 Oracle 数据库中
oracle·json·database
小蜗牛慢慢爬行27 分钟前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
hanbarger31 分钟前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
微服务 spring cloud1 小时前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
先睡1 小时前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
弗罗里达老大爷1 小时前
Redis
数据库·redis·缓存
仰望大佬0072 小时前
Avalonia实例实战五:Carousel自动轮播图
数据库·microsoft·c#
学不透java不改名2 小时前
sqlalchemy连接dm8 get_columns BIGINT VARCHAR字段不显示
数据库
一只路过的猫咪2 小时前
thinkphp6使用MongoDB多个数据,聚合查询的坑
数据库·mongodb