最近有個業務需求就是計算訂單創建時間離現在超過 4 小時的訂單都查找出來! 那么就需要用到日期函數了。 網上找了一下總共的日期函數有一下幾個:
CURRENT_DATE() | 返回數據庫當前日期 | 時間函數 | JPAQL HQL | CURRENT_DATE() | 返回數據庫當前日期 |
CURRENT_TIME() | 時間 | 時間函數 | JPAQL HQL | CURRENT_TIME() | 返回數據庫當前時間 |
SECOND(d) | 從日期中提取具體秒 | 時間函數 | HQL | SECOND(時間字段) | 空的時候返回null |
MINUTE(d) | 從日期中提取具體分 | 時間函數 | HQL | MINUTE(時間字段) | 空的時候返回null |
HOUR(d) | 從日期中提取具體小時 | 時間函數 | HQL | HOUR(時間字段 | 空的時候返回null |
DAY(d) | 從日期中提取具體天 | 時間函數 | HQL | DAY(時間字段) | 空的時候返回null |
MONTH(d) | 從日期中提取具體月 | 時間函數 | HQL | MONTH(時間字段) | 空的時候返回null |
YEAR(d) | 從日期中提取具體年 | 時間函數 | HQL | YEAR(時間字段) | 空的時候返回null |
顯然這個不能滿足需求,CURRENT_DATE 最后得出來的結果是:2015-07-18 而CURRENT_TIME()得出來的結果是:14:40:58,不算是一個日期類型,然后我百度了一下找到了這個函數 CURRENT_TIMESTAMP(),確定是可以使用的。返回的是:2015-07-18 14:40:58, OK。滿足了現在的需求。接下來就是計算兩個日期類型的差值的問題:
問題來了:CURRENT_TIMESTAMP() - createTime,當CURRENT_TIMESTAMP()為2015-07-18 14:42:55,createTime為:2015-07-15 10:30:21,返回的結果居然是:3041234,無法相信自己的眼睛。其實這個值也是有規律可循的, 每2位數表示一個 年 月 日 時 分 秒。
那么,34 :表示相差34秒
12:表示相差12分
04:表示相差4小時
以此類推。
當然也回存在以下的數值:2961512。這個怎么理解呢? 首先,12秒,15分很好理解,跑出來一個 96?莫非是96小時? 當然答案是錯誤的,因為當結算小時差時,被減數的值小於減數,那么就必須借位,即算法為: 24-(100-96) = 20,相差20小時,同理分鍾位如果是 81,那么相差分鍾數為:60-(100-81)=41分,以此類推。
基本的算法懂了,那么問題就好解決了,相差4小時,那么只需要滿足 (CURRENT_TIMESTAMP() - createTime)>40000即可,4分鍾只需要滿足 (CURRENT_TIMESTAMP() - createTime)>400即可,其它以此類推!
我找不到更好的計算兩個日期類型的差值的方法,只能用這個笨方法了,不知道網友們可有其它好的解決辦法供參考參考! 我相信這個需求其實還是非常大的。這個問題的緣由也是因為項目不能用原生的SQL導致的。