作爲替代方案,你可以通過避免標稱日期反彈,只是用數字和字符串處理:
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範圍內的整數,那麼這將格式化'壞'時間,可能在小時部分使用散列,而在彈跳日期時會出錯。這兩者都不是理想的,但希望是一個有爭議的問題。
''2300'和'937'是字符串,不是數字;你實際使用的數據類型是什麼? –
對不起,我的錯誤,整數是正確的,我糾正它。 – MavidDeyers