2017-03-09 93 views
0

我們有像810 1015這樣的數字對,表示小時和分鐘。我們必須計算這一對的微小差異。上面的例子會給125(分鐘)。Number to HH24:MM conversion - SQL,Oracle

您會給出什麼解決方案?我想轉換爲字符串和子串然後連接,但不知道它是3或4長,並使用IF ELSE,但會太複雜(如果沒有其他解決方案存在,我留下了這一點)。也想過以某種方式轉換爲基準60並減去,但也太複雜了。

在此先感謝。

+1

是3位數的最小長度或者你可以有85 8:05 AM?因爲在後一種情況下,你會遇到一個問題,因爲125可以代表1:25和12:05 –

+1

難道你不能只用'lpad'加零來使其長度爲4?然後做任何你打算用它做的事情。 – Plirkee

+1

問題不是3位數字是最小長度,但如果最後兩位數字總是代表分鐘。所以,比如說,105 - 是10:05還是1:05? [編輯]你如何表示00:20? –

回答

2

編輯:此解決方案是基於Plirkee對LPAD評論數字來獲得4個字符的字符串,並且Stefano Zanini的解決方案被修改爲允許0小時和24小時格式。

如果最後兩個數字始終代表分鐘,如果時間總是在24小時格式:

with t(time1, time2) as (
    select 810, 1015 from dual union all 
    select 20, 1530 from dual 
), 
conv(time1, time2) as (
    select lpad(to_char(time1), 4, '0'), 
     lpad(to_char(time2), 4, '0') 
    from t 
) 
select time1, 
     time2, 
     24 * 60 * (to_date(time2, 'HH24MI') - to_date(time1, 'HH24MI')) diff_minutes 
    from conv; 
+0

謝謝! lpad是失蹤的一塊。 –

0

假設3個位數是你的號碼(否則你就會有不確定的情況下),這下面的查詢應該做的伎倆

select (to_date(substr(t2, 1, length(t2)-2) || ':' || substr(t2, length(t2)-1, length(t2)), 'HH:MI') - 
     to_date(substr(t1, 1, length(t1)-2) || ':' || substr(t1, length(t1)-1, length(t1)), 'HH:MI')) * 24 * 60 cc 
from (select 810 t1, 1015 t2 from dual) 

的最小長度的步驟如下:

  1. 爆炸分爲兩部分的數字:最後兩位數字表示分鐘,其餘數字表示小時
  2. 用分隔符連接兩個部分(在本例中':')
  3. 轉換是串連成日期
  4. 乘兩個日期之間的差異(在天)24得到小時和60獲得分鐘
0

只是一個另外的調整可以使用。希望這可以幫助。

SELECT 
TO_CHAR(TO_DATE(LPAD(LPAD('1015',4,'0') - LPAD('810',4,'0'),4,'0'),'HH24MI'),'HH24')*60 
+TO_CHAR(TO_DATE(lpad(lpad('1015',4,'0') - lpad('810',4,'0'),4,'0'),'HH24MI'),'MI') MINUTES 
FROM dual; 
1

如何使用標準日期部分(如01-10-2000)將數據存儲爲DATA日期類型。所以,你的數據會

01-01-2000 8:10:00 
    01-01-2000 10:15:00 
etc 

然後,你可以做簡單的數學日期:)

+0

嗨!我們準備好了數據庫,充滿了記錄,所以任務就是改變它,並且必須將它轉換爲日期(你想象的方式)。 –