Oracle 时间多少秒以后 oracle interval 多少分钟之前 Oracle日期1小时后 Java时间多少秒以后 Java日期多少天之前
一、概述
在项目开发中,遇到一个类似于 超时关闭的订单(超过1分钟后关闭订单) 的需求,在数据的时间写入时,用的数据库系统的时间函数 SYSDATE , 而在处理超时时间时,用的是 JAVA应用程序时间处理。 在代码评审环节,大佬们给出的意见时,万一出现时间不一致的情况,会产生bug 。要改!统一用一个来源的时间 (统一用数据库时间 or 统一用java应用程序时间 )。
大概流程是:
1、 数据写入,用数据库系统时间 
insert USER_order (id , lock_time) values ('1', sysdate) 
2、超过一分后 时间获取是
new java.util.Date()  + 1分钟基本环境信息:
-  
  -  
    - 数据库: ORACLE 11G
- JAVA: 万年不变的JDK8
 
 
-  
    
问题定位:
由于决定,统一使用 Oracle数据库的时间,那么问题变成: Oracle中时间获取多少分钟后。在Oracle中可以通过SYSDATE获取当前时间,加上组合 INTERVAL 实现时间的偏移量处理,本文将记录 SYSDATE和INTERVAL函数的用法。
从点到线,本文也会记录 在java程序中,获取多少分钟后,获取多少小时后的时间 .
二、Oracle时间多少秒后
1、oracle 获取当前时间
-- oracle 获取当前时间
SELECT
    SYSDATE ,
    SYSTIMESTAMP
FROM
    dual ;2、一年之后 , 一年之前的今天
SELECT
    SYSDATE 
    ,  SYSDATE + INTERVAL '1' YEAR 一年后
    , SYSTIMESTAMP + INTERVAL '-1' YEAR "一年前"
FROM
    dual ;3、一个月
SELECT
    SYSDATE 
    ,  SYSDATE + INTERVAL '1' MONTH  
    , SYSTIMESTAMP + INTERVAL '-1' MONTH 
FROM
    dual ;4、一天
SELECT
    SYSDATE 
    ,  SYSDATE + INTERVAL '1' DAY  
    , SYSTIMESTAMP + INTERVAL '-1' DAY 
FROM
    dual ;
5、 一小时
SELECT
    SYSDATE 
    ,  SYSDATE + INTERVAL '1' HOUR  
    , SYSTIMESTAMP + INTERVAL '-1' HOUR 
FROM
    dual ;6、一分钟
SELECT
    SYSDATE 
    ,  SYSDATE + INTERVAL '1' MINUTE  
    , SYSTIMESTAMP + INTERVAL '-1' HOUR 
FROM
    dual ;7、 10秒钟
SELECT
    SYSDATE 
    ,  SYSDATE + INTERVAL '10' SECOND  
    , SYSTIMESTAMP + INTERVAL '-10' SECOND 
FROM
    dual ;三、Java时间多少秒后
1、使用 DateUtils工具类,依赖pom如下
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
   <version>3.10</version>
</dependency>2、相关测试代码如下:
/**
 * Description: java日期 多少分钟后/多少天后
 * @return void
 * @version v1.0
 * @author wu
 * @date 2023/7/28 18:00
 */
@Test
public void dateAddTimeTest() throws Exception{
    final Date date = new Date();
    System.out.println("当前时间是:" +DateUtils.format(date,"yyyy-MM-dd HH:mm:ss"));
    System.out.println();
    // 1、一年后,一年前
    final Date date1 = DateUtils.addYears(date, 1);
    final Date date2 = DateUtils.addYears(date, -1);
    System.out.println("一年后:" +DateUtils.format(date1,"yyyy-MM-dd HH:mm:ss"));
    System.out.println("一年前:" +DateUtils.format(date2,"yyyy-MM-dd HH:mm:ss"));
    System.out.println();
    // 2、一个月
    final Date date3 = DateUtils.addMonths(date, 1);
    final Date date4 = DateUtils.addMonths(date, -1);
    System.out.println("一个月:" +DateUtils.format(date3,"yyyy-MM-dd HH:mm:ss"));
    System.out.println("一个月:" +DateUtils.format(date4,"yyyy-MM-dd HH:mm:ss"));
    System.out.println();
    // 3、一天
    final Date date5 = DateUtils.addDays(date, 1);
    final Date date6 = DateUtils.addDays(date, -1);
    System.out.println("一天后:" +DateUtils.format(date5,"yyyy-MM-dd HH:mm:ss"));
    System.out.println("一天前:" +DateUtils.format(date6,"yyyy-MM-dd HH:mm:ss"));
    // ignore more DateUtils time test ....
}
2.1、输出结果如下:
当前时间是:2023-07-28 18:23:12
一年后:2024-07-28 18:23:12
一年前:2022-07-28 18:23:12
一个月:2023-08-28 18:23:12
一个月:2023-06-28 18:23:12
一天后:2023-07-29 18:23:12
一天前:2023-07-27 18:23:12四、MyBatis中使用
1、在MyBatis中使用如下,注意使用 ${time} ,不能使用 #{time}
// 注意:拼接成 单引号的字符串 ,具体数值可以改到配置中心
/**
 * 过期时间,单位:秒
 */
@Value("${expire.time:60}")
private int expireTime;
String time = "'".concat(String.valueOf(expireTime)).concat("'");
-- myBatis sql 中写法如下
UPDATE USER_order
SET STATUS = '1'
WHERE LOCK_TIME <= SYSDATE+INTERVAL ${time} SECOND
五、总结
1、Oracle中,实现获取多少时间之后、之前,可以通过 INTERVAL 函数来实现 ,其中 数值 > 0 ,则为之后; 数值 < 0 , 则为之前。
SYSDATE + INTERVAL '10' 单位 
单位 可以数值是: 
YEAR 年
MONTH 月
DAY 日
HOUR 时
MINUTE 分
SECOND  秒2、在java程序中,可以使用 DateUtils.addXXX ,实现获取多少时间之前、之后。




















