2

我想做一个将最多 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

我应该改变什么?

4

5 回答 5

1

使用lpad()

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

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

于 2019-09-11T14:33:32.383 回答
1

假设您不会有超过 4 位数字:

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

输出

| 时间 |
| :---- |
| 00:07 |
| 00:17 |
| 03:17 |
| 23:17 |

db<>在这里摆弄

于 2019-09-11T14:38:17.503 回答
0

您应该使用 LPAD 用前导零填充输入,长度不超过 4。

于 2019-09-11T14:32:25.603 回答
0

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

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 
于 2019-09-11T14:40:24.807 回答
0

你在这里处理的是一个“混合基数”数字。

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

您可以使用余数运算符(通常是MODor %,并且经常被错误地称为“模运算符”)来获取分钟部分,并使用整数除法(通常是/or \)来获取小时部分。在每种情况下,您都将除以 100。

例如:

2317 % 100 = 17
2317 / 100 = 23

7 % 100 = 7
7 / 100 = 0

抱歉,但我不记得 Oracle 中这些运算符的符号或函数名称了。

于 2019-09-11T16:08:49.393 回答