a站免費(fèi)最好看的電影片推薦百度推廣怎么推廣
Oracle 時(shí)間多少秒以后 oracle interval 多少分鐘之前 Oracle日期1小時(shí)后 Java時(shí)間多少秒以后 Java日期多少天之前
一、概述
????????在項(xiàng)目開發(fā)中,遇到一個(gè)類似于 超時(shí)關(guān)閉的訂單(超過1分鐘后關(guān)閉訂單) 的需求,在數(shù)據(jù)的時(shí)間寫入時(shí),用的數(shù)據(jù)庫系統(tǒng)的時(shí)間函數(shù) SYSDATE , 而在處理超時(shí)時(shí)間時(shí),用的是 JAVA應(yīng)用程序時(shí)間處理。 在代碼評審環(huán)節(jié),大佬們給出的意見時(shí),萬一出現(xiàn)時(shí)間不一致的情況,會(huì)產(chǎn)生bug 。要改!統(tǒng)一用一個(gè)來源的時(shí)間 (統(tǒng)一用數(shù)據(jù)庫時(shí)間 or 統(tǒng)一用java應(yīng)用程序時(shí)間 )。
????????大概流程是:
? ??
1、 數(shù)據(jù)寫入,用數(shù)據(jù)庫系統(tǒng)時(shí)間
insert USER_order (id , lock_time) values ('1', sysdate) 2、超過一分后 時(shí)間獲取是
new java.util.Date() + 1分鐘
基本環(huán)境信息:
-
-
- 數(shù)據(jù)庫: ORACLE 11G
- JAVA: 萬年不變的JDK8
-
問題定位:
????????由于決定,統(tǒng)一使用 Oracle數(shù)據(jù)庫的時(shí)間,那么問題變成: Oracle中時(shí)間獲取多少分鐘后。在Oracle中可以通過SYSDATE獲取當(dāng)前時(shí)間,加上組合 INTERVAL 實(shí)現(xiàn)時(shí)間的偏移量處理,本文將記錄 SYSDATE和INTERVAL函數(shù)的用法。
????????從點(diǎn)到線,本文也會(huì)記錄 在java程序中,獲取多少分鐘后,獲取多少小時(shí)后的時(shí)間 .
二、Oracle時(shí)間多少秒后
1、oracle 獲取當(dāng)前時(shí)間
-- oracle 獲取當(dāng)前時(shí)間
SELECTSYSDATE ,SYSTIMESTAMP
FROMdual ;
2、一年之后 , 一年之前的今天
SELECTSYSDATE , SYSDATE + INTERVAL '1' YEAR 一年后, SYSTIMESTAMP + INTERVAL '-1' YEAR "一年前"
FROMdual ;
3、一個(gè)月
SELECTSYSDATE , SYSDATE + INTERVAL '1' MONTH , SYSTIMESTAMP + INTERVAL '-1' MONTH
FROMdual ;
4、一天
SELECTSYSDATE , SYSDATE + INTERVAL '1' DAY , SYSTIMESTAMP + INTERVAL '-1' DAY
FROMdual ;
5、 一小時(shí)
SELECTSYSDATE , SYSDATE + INTERVAL '1' HOUR , SYSTIMESTAMP + INTERVAL '-1' HOUR
FROMdual ;
6、一分鐘
SELECTSYSDATE , SYSDATE + INTERVAL '1' MINUTE , SYSTIMESTAMP + INTERVAL '-1' HOUR
FROMdual ;
7、 10秒鐘
SELECTSYSDATE , SYSDATE + INTERVAL '10' SECOND , SYSTIMESTAMP + INTERVAL '-10' SECOND
FROMdual ;
三、Java時(shí)間多少秒后
1、使用 DateUtils工具類,依賴pom如下
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.10</version>
</dependency>
2、相關(guān)測試代碼如下:
/*** 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("當(dāng)前時(shí)間是:" +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、一個(gè)月final Date date3 = DateUtils.addMonths(date, 1);final Date date4 = DateUtils.addMonths(date, -1);System.out.println("一個(gè)月:" +DateUtils.format(date3,"yyyy-MM-dd HH:mm:ss"));System.out.println("一個(gè)月:" +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、輸出結(jié)果如下:
當(dāng)前時(shí)間是:2023-07-28 18:23:12一年后:2024-07-28 18:23:12
一年前:2022-07-28 18:23:12一個(gè)月:2023-08-28 18:23:12
一個(gè)月:2023-06-28 18:23:12一天后:2023-07-29 18:23:12
一天前:2023-07-27 18:23:12
四、MyBatis中使用
1、在MyBatis中使用如下,注意使用 ${time} ,不能使用 #{time}
// 注意:拼接成 單引號的字符串 ,具體數(shù)值可以改到配置中心/*** 過期時(shí)間,單位:秒*/
@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
五、總結(jié)
????????1、Oracle中,實(shí)現(xiàn)獲取多少時(shí)間之后、之前,可以通過 INTERVAL 函數(shù)來實(shí)現(xiàn) ,其中 數(shù)值 > 0 ,則為之后; 數(shù)值 < 0 , 則為之前。
SYSDATE + INTERVAL '10' 單位
單位 可以數(shù)值是:
YEAR 年
MONTH 月
DAY 日
HOUR 時(shí)
MINUTE 分
SECOND 秒
????????2、在java程序中,可以使用 DateUtils.addXXX ,實(shí)現(xiàn)獲取多少時(shí)間之前、之后。