Oracle SQL:将灵活整数转换为时间

Oracle SQL: Converting a flexible integer into time

我可以使用以下语句将 4 位数字(例如 2300)转换为 (23:00):

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

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

但是,如果数据库中的值 另外 存储为三位数字值,如果第一个值低于 10(例如 '937' 为9:37)。

我有点需要仔细检查声明,有人知道吗?

您需要先用“0”对其进行 LPAD

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

使用 4 个字符串调用 LPAD(.., 4) 是空操作

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

如果值存储为数字

,您可以使用格式 'fm0999' 的 TO_CHAR
select to_date(to_char(937, 'fm0999'), 'HH24MI') from dual;

format models

作为替代方案,您可以避免在标称日期之间跳转,而只使用数字和字符串操作:

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 范围内的整数,那么这将格式化 'bad' 次,可能使用小时部分的哈希值,而在日期中跳转会出错。两者都不是理想的,但希望是一个有争议的问题。