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

时间:2017-07-27 08:35:31

标签: sql oracle time to-date to-char

我可以使用以下声明将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),我怎么能帮助自己呢?

我有点需要双重检查声明,任何人都有线索?

3 个答案:

答案 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;

请参阅format models

答案 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范围内的整数,那么这将形成“坏”时间,可能是小时部分的哈希值,而在日期中反弹则会出错。两者都不理想,但希望是一个没有实际意义的点。