2017-07-27 65 views
0

我可以轉換一個4位數的號碼(2300例)到(23:00)用下面的語句:的Oracle SQL:轉換靈活的整數到時間

select to_char (to_date (2300, 'HH24MI'), 'HH:MI') integer_time from dual; 

Result: 
INTEGER_TIME 
-------- 
11:00 

但我怎麼能幫助自己,如果如果第一個值低於10(例如9:37爲'937'),則數據庫中的值爲,另外存儲爲三位數值。

我有點需要一個雙重檢查對此聲明,任何人都有線索?

+0

''2300'和'937'是字符串,不是數字;你實際使用的數據類型是什麼? –

+0

對不起,我的錯誤,整數是正確的,我糾正它。 – MavidDeyers

回答

4

您需要使用「0」第一

SELECT LPAD('937', 4, '0') FROM dual 

LPAD(.., 4)調用使用4個字符的字符串是無操作

SELECT LPAD('1937', 4, '0') FROM dual 
+0

正常工作,謝謝! – MavidDeyers

2

您可以使用TO_CHAR與格式「來LPAD它fm0999' 如果該值被存儲爲NUMBER

select to_date(to_char(937, 'fm0999'), 'HH24MI') from dual; 

看到format models

1

作爲替代方案,你可以通過避免標稱日期反彈,只是用數字和字符串處理:

select to_char(trunc(937/100), 'FM00') ||':'|| to_char(mod(937, 100), 'FM00') from dual; 

TO_CHAR 
------- 
09:37 

...但如果你的出發值實際上是一個字符串,而不是數字還有另一個層面隱式轉換正在進行。 (如果它是一個字符串,您可能在驗證時遇到更大的問題,但如果您假設數據始終如預期那麼lpad路徑可能是最簡單的方法)。

有了一個範圍值:

with t (n) as (
    select 0 from dual 
    union all select 1 from dual 
    union all select 59 from dual 
    union all select 937 from dual 
    union all select 2300 from dual 
    union all select 2359 from dual 
) 
select n, to_char(trunc(n/100), 'FM00') ||':'|| to_char(mod(n, 100), 'FM00') 
    as integer_time 
from t; 

     N INTEGER 
---------- ------- 
     0 00:00 
     1 00:01 
     59 00:59 
     937 09:37 
     2300 23:00 
     2359 23:59 

如果你不想前導零 - 即937,而不是09:37 - 那麼第一格式模式更改爲FM90

如果你的數據沒有被限制爲0-2359範圍內的整數,那麼這將格式化'壞'時間,可能在小時部分使用散列,而在彈跳日期時會出錯。這兩者都不是理想的,但希望是一個有爭議的問題。