我想将数字更改为 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 中这些运算符的符号或函数名称。
我想请求将最多 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 中这些运算符的符号或函数名称。