我可以使用以下声明将4位数字(例如2300)转换为(23:00):
select to_char ( to_date ( 2300, 'HH24MI'), 'HH:MI') integer_time from dual;
Result:
INTEGER_TIME
--------
11:00
但是,如果数据库中的值另外存储为三位数值,如果第一个值低于10(例如9:37为937),我怎么能帮助自己呢?
我有点需要双重检查声明,任何人都有线索?
答案 0 :(得分:4)
您需要使用' 0'第一
SELECT LPAD('937', 4, '0') FROM dual
使用4个字符的字符串调用LPAD(.., 4)
是一个无操作
SELECT LPAD('1937', 4, '0') FROM dual
答案 1 :(得分:2)
如果值存储为NUMBER,则可以使用格式为'fm0999'的TO_CHAR
select to_date(to_char(937, 'fm0999'), 'HH24MI') from dual;
答案 2 :(得分: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范围内的整数,那么这将形成“坏”时间,可能是小时部分的哈希值,而在日期中反弹则会出错。两者都不理想,但希望是一个没有实际意义的点。