我想将数字更改为小时:分钟
Posted
技术标签:
【中文标题】我想将数字更改为小时:分钟【英文标题】:I want to change a number to a hours:minutes 【发布时间】:2020-01-13 10:18:41 【问题描述】:我想做一个请求,将最多 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
我应该改变什么?
【问题讨论】:
【参考方案1】:你在这里处理的是一个“混合基数”数字。
如果数字输入为字符串,请先转换为整数。
您可以使用余数运算符(通常是MOD
或%
,并且经常被错误地称为“模运算符”)来获得分钟部分,并使用整数除法(通常是/
或\
)来获得小时部分。在每种情况下,您都将除以 100。
例如:
2317 % 100 = 17
2317 / 100 = 23
7 % 100 = 7
7 / 100 = 0
抱歉,我一时想不起来 Oracle 中这些运算符的符号或函数名称。
【讨论】:
Oracle 没有模数/余数或整数除法operators。请参阅 Gordon 的答案,它使用mod()
函数代替分钟,并使用 floor(x/100)
获得 23 而不是 23.17 的小时数。然后,这些整数部分必须以带有前导零和冒号的字符串连接在一起。
@AlexPoole,如果它有 MOD 函数,它必须有一些模数或余数运算符!但是,如果它没有整数除法运算符,我将采取这一点-尽管在这种情况下,它如何在不将返回类型更改为浮点数的情况下根本表达任何整数除法?它是否没有整数类型的除法运算符,然后将(截断的)商作为整数返回?
mod()
是一个函数,而不是一个运算符——它们是不同类别的东西吗? Oracle 并没有真正的整数数据类型just number
(and float
)(有一些语法variants for compatibility)。数字可以在精度/比例上受到限制,但 4/2 的结果只是一个普通的无限制 number
,4/3 的结果也是如此。
All of these show Typ=2
via dump()
,即上面链接的表格中的NUMBER [ (p [, s]) ]
。 Oracle 对它们的处理方式完全相同。 (float
是一个子类型,这里不相关。)
@AlexPoole,这当然很奇怪,一种没有整数类型的编程语言!您还对您的原始评论给了我不同的解释,这并不是否认 MOD 操作的存在(我最初是这样理解的),而是强调它是一个函数而不是(中缀)运算符.我的帖子的重点显然不是在 Oracle 中给出代码示例(我有一段时间没有使用过),而是为在不同位置包含不同基数的数字概念提供一个名称,并简要说明一种操纵它们的方法。【参考方案2】:
您可以操作然后格式化数字:
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
【讨论】:
【参考方案3】:假设您的数字不会超过 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小提琴here
【讨论】:
@LougEagle 问题中链接的 dbfiddle 正在 Oracle 11gR2 上运行 .... 所以,是的。 哦,你给了一个链接,我的错【参考方案4】:使用lpad()
:
select lpad(floor(x / 100), 2, '0') || ':' || lpad(mod(x, 100), 2, '0')
注意:这假定x
是一个数字——如文本中所述——而不是一个字符串(如查询中所使用的)。
【讨论】:
【参考方案5】:您应该使用 LPAD 用前导零填充输入,最长为 4。
【讨论】:
以上是关于我想将数字更改为小时:分钟的主要内容,如果未能解决你的问题,请参考以下文章