Oracle 时间多少秒以后 oracle interval 多少分钟之前 Oracle日期1小时后 Java时间多少秒以后 Java日期多少天之前

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 获取当前时间

sql 复制代码
-- oracle 获取当前时间
SELECT
    SYSDATE ,
    SYSTIMESTAMP
FROM
    dual ;

2、一年之后 , 一年之前的今天

sql 复制代码
SELECT
    SYSDATE 
    ,  SYSDATE + INTERVAL '1' YEAR 一年后
    , SYSTIMESTAMP + INTERVAL '-1' YEAR "一年前"
FROM
    dual ;

3、一个月

sql 复制代码
SELECT
    SYSDATE 
    ,  SYSDATE + INTERVAL '1' MONTH  
    , SYSTIMESTAMP + INTERVAL '-1' MONTH 
FROM
    dual ;

4、一天

sql 复制代码
SELECT
    SYSDATE 
    ,  SYSDATE + INTERVAL '1' DAY  
    , SYSTIMESTAMP + INTERVAL '-1' DAY 
FROM
    dual ;

5、 一小时

sql 复制代码
SELECT
    SYSDATE 
    ,  SYSDATE + INTERVAL '1' HOUR  
    , SYSTIMESTAMP + INTERVAL '-1' HOUR 
FROM
    dual ;

6、一分钟

sql 复制代码
SELECT
    SYSDATE 
    ,  SYSDATE + INTERVAL '1' MINUTE  
    , SYSTIMESTAMP + INTERVAL '-1' HOUR 
FROM
    dual ;

7、 10秒钟

sql 复制代码
SELECT
    SYSDATE 
    ,  SYSDATE + INTERVAL '10' SECOND  
    , SYSTIMESTAMP + INTERVAL '-10' SECOND 
FROM
    dual ;

三、Java时间多少秒后

1、使用 DateUtils工具类,依赖pom如下

XML 复制代码
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
   <version>3.10</version>
</dependency>

2、相关测试代码如下:

java 复制代码
/**
 * 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、输出结果如下:

java 复制代码
当前时间是: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}

java 复制代码
// 注意:拼接成 单引号的字符串 ,具体数值可以改到配置中心

/**
 * 过期时间,单位:秒
 */
@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 , 则为之前

java 复制代码
SYSDATE + INTERVAL '10' 单位 
单位 可以数值是: 
YEAR 年
MONTH 月
DAY 日
HOUR 时
MINUTE 分
SECOND  秒

2、在java程序中,可以使用 ++DateUtils.addXXX++ ,实现获取多少时间之前、之后。