2016-02-17 137 views
0

我想要想出一種方法來計算兩個日期之間在幾小時和幾分鐘之間的差異。以小時和分鐘查找兩個日期之間的差異

我有兩列Start DateTimeStamp表:

Start Date    Timestamp 
-------------------- -------------------- 
05/JAN/2016 05:30:00 01/JAN/2016 10:02:29 
30/JAN/2016 06:10:00 18/JAN/2016 19:24:00 
23/JAN/2016 06:10:00 08/JAN/2016 10:46:00 
05/JAN/2016 05:30:00 30/DEC/2015 16:07:00 
23/JAN/2016 06:10:00 08/JAN/2016 12:18:05 
01/JAN/2016 14:10:00 16/DEC/2015 16:36:56 
01/JAN/2016 14:10:00 16/DEC/2015 11:41:00 
03/JAN/2016 05:15:00 02/JAN/2016 11:23:15 
03/JAN/2016 05:15:00 02/JAN/2016 07:52:00 

我使用查詢:

select ROUND(RM_LIVE.CRWGNDACTTIME.GNDACTSTARTRM_LIVE.TRANSACTIONLOG.TIMESTAMP,2) 
         AS "Difference" 
    from Transaction; 

查詢結果是:

0.002721428571428571428571428571428571428571 
0.008178571428571428571428571428571428571429 
0.0105785714285714285714285714285714285714 
0.003971428571428571428571428571428571428571 

預期結果:

133:23 
91:28 
355:24 
353:52 
274:46 

我在使用這個公式Excel中預期的結果:

= MAX(T982+U982,W982+V982) - MIN(T982+U982,W982+V982) 

我怎樣才能用Oracle SQL相同的結果?

CASE 
    WHEN trunc(24 * abs(RM_LIVE.TRANSACTIONLOG.TIMESTAMP 
- RM_LIVE.CRWGNDACTTIME.GNDACTSTART)) 
    ||':'|| lpad(round(60 * mod(24 * abs(RM_LIVE.TRANSACTIONLOG.TIMESTAMP 
- RM_LIVE.CRWGNDACTTIME.GNDACTSTART), 1)), 2, '0') <= '11:00' THEN  'LESS' 
ELSE 'MORE' 
END AS "mORE/LESS", 


386:29 1055 01-JAN-16 16-DEC-15 MORE 
**102:41 1055 08-NOV-15 04-NOV-15 LESS** 
381:33 1055 01-JAN-16 16-DEC-15 MORE 
176:45 1055 20-NOV-15 12-NOV-15 MORE 
**119:54 1055 08-NOV-15 03-NOV-15 LESS** 
+0

我檢查,但沒有西隧我那裏尋找只是天不以小時 –

+0

他詢問結果在24小時內和IM在時間要求差的兩個日期,以便有兩種不同的東西 –

+0

爲什麼他們有什麼不同?您的第一排'05/JAN/2016 05:30:00 01/1/2016 10:02:29',差異爲3天,19小時,27分30秒; 3天是72小時,所以總共是91小時。對該鏈接問題的查詢給出了91:27:30。對於你的第四個價值,它給出了133:22。你可以放棄秒部分? –

回答

2

我已經展示在this answer解釋一對夫婦的變化,但它似乎是做的比你想稍微多 - 你不希望看到的秒 - 並且不允許超過100個小時。

得到你想要的輸出最簡單的方法是:

trunc(24 * (RM_LIVE.CRWGNDACTTIME.GNDACTSTART 
    - RM_LIVE.TRANSACTIONLOG.TIMESTAMP)) 
    ||':'|| lpad(round(60 * mod(24 * (RM_LIVE.CRWGNDACTTIME.GNDACTSTART 
    - RM_LIVE.TRANSACTIONLOG.TIMESTAMP), 1)), 2, '0') 
as difference 

第一部分獲得了整個的小時數,這是類似於您在評論中添加一個方法,但不是截斷四捨五入只能得到整個小時。然後是一個冒號分隔符。然後通過從小時計算中獲得剩餘時間來計算分鐘數 - 通過mod()這是小時數,並將其乘以60. lpad()在分鐘數上增加了前導零,但您可以使用to_char()代替。

如果您有多個範圍的組合,其中時間戳可能在開始時間之前或之後,那麼您可以使用the abs() function總是獲得肯定的結果。

trunc(24 * abs(RM_LIVE.CRWGNDACTTIME.GNDACTSTART 
    - RM_LIVE.TRANSACTIONLOG.TIMESTAMP)) 
    ||':'|| lpad(round(60 * mod(24 * abs(RM_LIVE.CRWGNDACTTIME.GNDACTSTART 
    - RM_LIVE.TRANSACTIONLOG.TIMESTAMP), 1)), 2, '0') 
as difference 

與單個表中嘲笑你的數據演示:

create table your_table(id, start_time, timestamp) as 
    select 1, to_date ('05/JAN/2016 05:30:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('01/JAN/2016 10:02:29', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 2, to_date ('30/JAN/2016 06:10:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('18/JAN/2016 19:24:00', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 3, to_date ('23/JAN/2016 06:10:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('08/JAN/2016 10:46:00', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 4, to_date ('05/JAN/2016 05:30:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('30/DEC/2015 16:07:00', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 5, to_date ('23/JAN/2016 06:10:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('08/JAN/2016 12:18:05', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 6, to_date ('01/JAN/2016 14:10:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('16/DEC/2015 16:36:56', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 7, to_date ('01/JAN/2016 14:10:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('16/DEC/2015 11:41:00', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 8, to_date ('03/JAN/2016 05:15:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('02/JAN/2016 11:23:15', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 9, to_date ('03/JAN/2016 05:15:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('02/JAN/2016 07:52:00', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 10, to_date ('16/JAN/2016 11:15:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('16/JAN/2016 12:44:00', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 11, to_date ('16/JAN/2016 11:15:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('16/JAN/2016 12:50:00', 'DD/MON/YYYY HH24:MI:SS') from dual; 

等效查詢:

select start_time, timestamp, trunc(24 * abs(start_time - timestamp)) 
    ||':'|| lpad(round(60 * mod(24 * abs(start_time - timestamp), 1)), 2, '0') 
    as difference 
from your_table 
order by id; 

START_TIME   TIMESTAMP   DIFFERENCE 
------------------- ------------------- ---------- 
2016-01-05 05:30:00 2016-01-01 10:02:29 91:28  
2016-01-30 06:10:00 2016-01-18 19:24:00 274:46  
2016-01-23 06:10:00 2016-01-08 10:46:00 355:24  
2016-01-05 05:30:00 2015-12-30 16:07:00 133:23  
2016-01-23 06:10:00 2016-01-08 12:18:05 353:52  
2016-01-01 14:10:00 2015-12-16 16:36:56 381:33  
2016-01-01 14:10:00 2015-12-16 11:41:00 386:29  
2016-01-03 05:15:00 2016-01-02 11:23:15 17:52  
2016-01-03 05:15:00 2016-01-02 07:52:00 21:23  
2016-01-16 11:15:00 2016-01-16 12:44:00 1:29  
2016-01-16 11:15:00 2016-01-16 12:50:00 1:35  

你不能簡單的比較字符串值你想要的 - 它必須是一個像91:28這樣的值的字符串 - 與其他任何東西,因爲數字的字符串比較不好。如你所見,比較'119:54'和'11:00'可以有效地比較每個字符串的第三個字符,因爲前兩個字符相同,所以9:

這將是簡單的把它作爲一個小數比較:

CASE 
    WHEN round(24 * abs(RM_LIVE.TRANSACTIONLOG.TIMESTAMP 
    - RM_LIVE.CRWGNDACTTIME.GNDACTSTART), 2) <= 11 THEN 'LESS" 
ELSE 'MORE' 
END AS "mORE/LESS", 

爲91:28例如,將比較小數版本91.46代替; 119:54比119.9,超過11; 102:41進行比較,102.68,這也超過11

或者你可以通過將固定值通過24(小時在一天),而不是相乘的時間差略微簡化它:

CASE 
    WHEN abs(RM_LIVE.TRANSACTIONLOG.TIMESTAMP 
    - RM_LIVE.CRWGNDACTTIME.GNDACTSTART) <= 11/24 THEN 'LESS" 
ELSE 'MORE' 
END AS "mORE/LESS", 
+0

在大多數再編碼器的即時通訊geeting此 -1:-2 -1:-3 如果日期是這樣 16/JAN/2016 11時15分00秒16 \t/JAN/2016年12時44分零零秒 16/JAN/2016 11:15:00 \t 16/JAN/2016 12點50個00秒 –

+0

精湛非常感謝... –

+0

一件事的差值結果來爲文本我如何能轉換成數字或時間 –

相關問題