我想将数字更改为 hours:minutes

I want to change a number to a hours:minutes

我想请求将最多 4 位数字('X', 'XX', 'XXX'or 'XXXX')更改为格式HH:MM

例如,我希望输出是这样的:

7    => 00:07
17   => 00:17
317  => 03:17
2317 => 23:17

我试过类似的东西

select  substr(X,0,2)||':'||substr(X,3,2) from TABLE

其中 X 最多为 4 位数字

但实际输出是:

7    => 7:
17   => 17:
317  => 31:7
2317 => 23:17

我应该改变什么?

您应该使用 LPAD 将前导零填充到长度为 4 的输入。

使用lpad():

select lpad(floor(x / 100), 2, '0') || ':' || lpad(mod(x, 100), 2, '0')

注意:这假设 x 是一个数字——如文中所述——而不是字符串(如查询中所用)。

假设您的号码不超过 4 位:

SELECT SUBSTR( LPAD( x, 4, '0' ), 1, 2 ) || ':' || SUBSTR( LPAD( x, 4, '0' ), 3, 2 ) AS time
FROM   test_data

输出:

| TIME  |
| :---- |
| 00:07 |
| 00:17 |
| 03:17 |
| 23:17 |

db<>fiddle here

您可以操作然后格式化数字:

to_char(n/100, 'FM00D00', 'NLS_NUMERIC_CHARACTERS=:,')

to_char() 的可选第三个参数将常用的句点或逗号小数点分隔符替换为冒号,使其看起来像一个时间。

-- CTE for sample values
with t (n) as (
  select 7 from dual
  union all
  select 17 from dual
  union all
  select 317 from dual
  union all
  select 2317 from dual
)
-- actual query
select n,
  to_char(n/100, 'FM00D00', 'NLS_NUMERIC_CHARACTERS=:,') as time
from t;

         N TIME  
---------- ------
         7 00:07 
        17 00:17 
       317 03:17 
      2317 23:17 

您在这里处理的是一个 "mixed radix" 号码。

如果数字输入为字符串,请先转换为整数。

你可以使用取余运算符(通常是MOD%,并且经常被错误地称为"modulus operator")来得到分钟部分,整数除法(通常是/\) 来获取小时部分。在每种情况下,你都会除以 100。

例如:

2317 % 100 = 17
2317 / 100 = 23

7 % 100 = 7
7 / 100 = 0

抱歉,我想不起来 Oracle 中这些运算符的符号或函数名称。