Oracle PL SQL 负分钟数转换为负数 HH:mm
Oracle PL SQL Negative minutes converted to negative HH:mm
该代码使用分钟的负整数或正整数
我已经成功使用下面的代码一段时间了,但后来意识到如果输入的分钟数小于 -60(即 -15),则返回的 hh:mm 值为正而不是负。我能理解为什么这不起作用,但我正在努力想出一个替代方案。
通常输入的值大于 60 或 -60,这始终确保小时值是正确的符号。
Select nvl(-15,0) mins, decode(to_char(trunc(-15/60),'9999') || ':' ||ltrim(to_char(mod(abs(-15),60), '00')),':','00:00', to_char(trunc(-15/60),'9999') || ':' ||ltrim(to_char(mod(abs(-15),60), '00'))) hrs_mins from dual
我expecting/wanting看到-15和-00:15
我想您还需要检查一下——您传递给这段代码的值是正数还是负数(参见第 7 行)。另外,我将格式模型从 9999 修改为 9900。
SQL> SELECT NVL (&&value, 0) mins,
2 DECODE (
3 TO_CHAR (TRUNC (&&value / 60), '9900')
4 || ':'
5 || LTRIM (TO_CHAR (MOD (ABS (&&value), 60), '00')),
6 ':', '00:00',
7 CASE WHEN &&value < 0 THEN '-' END
8 || TO_CHAR (TRUNC (&&value / 60), 'FM9900')
9 || ':'
10 || LTRIM (TO_CHAR (MOD (ABS (&&value), 60), '00'))) hrs_mins
11 FROM DUAL;
Enter value for value: -15
MINS HRS_MINS
---------- ----------
-15 -00:15
SQL> undefine value
SQL> /
Enter value for value: 25
MINS HRS_MINS
---------- ----------
25 00:25
SQL>
更简单:
with
test_data (mins) as (
select 10 from dual union all
select 60 from dual union all
select 150 from dual union all
select 0 from dual union all
select null from dual union all
select -15 from dual union all
select -120 from dual union all
select -150 from dual union all
select -1587 from dual
)
select mins,
to_char(sign(mins) * (trunc(abs(mins) / 60) + mod(abs(mins), 60) / 100)
, 'fm99999990d00', 'nls_numeric_characters = :,') as hours_mins
from test_data
;
MINS HOURS_MINS
---------- ------------
10 0:10
60 1:00
150 2:30
0 0:00
-15 -0:15
-120 -2:00
-150 -2:30
-1587 -26:27
在您的尝试中,您将 null
转换为 0;如果你有充分的理由,你也可以在这里做。我没有;在大多数情况下 null
不(或不应该)表示“零”。
该代码使用分钟的负整数或正整数 我已经成功使用下面的代码一段时间了,但后来意识到如果输入的分钟数小于 -60(即 -15),则返回的 hh:mm 值为正而不是负。我能理解为什么这不起作用,但我正在努力想出一个替代方案。 通常输入的值大于 60 或 -60,这始终确保小时值是正确的符号。
Select nvl(-15,0) mins, decode(to_char(trunc(-15/60),'9999') || ':' ||ltrim(to_char(mod(abs(-15),60), '00')),':','00:00', to_char(trunc(-15/60),'9999') || ':' ||ltrim(to_char(mod(abs(-15),60), '00'))) hrs_mins from dual
我expecting/wanting看到-15和-00:15
我想您还需要检查一下——您传递给这段代码的值是正数还是负数(参见第 7 行)。另外,我将格式模型从 9999 修改为 9900。
SQL> SELECT NVL (&&value, 0) mins,
2 DECODE (
3 TO_CHAR (TRUNC (&&value / 60), '9900')
4 || ':'
5 || LTRIM (TO_CHAR (MOD (ABS (&&value), 60), '00')),
6 ':', '00:00',
7 CASE WHEN &&value < 0 THEN '-' END
8 || TO_CHAR (TRUNC (&&value / 60), 'FM9900')
9 || ':'
10 || LTRIM (TO_CHAR (MOD (ABS (&&value), 60), '00'))) hrs_mins
11 FROM DUAL;
Enter value for value: -15
MINS HRS_MINS
---------- ----------
-15 -00:15
SQL> undefine value
SQL> /
Enter value for value: 25
MINS HRS_MINS
---------- ----------
25 00:25
SQL>
更简单:
with
test_data (mins) as (
select 10 from dual union all
select 60 from dual union all
select 150 from dual union all
select 0 from dual union all
select null from dual union all
select -15 from dual union all
select -120 from dual union all
select -150 from dual union all
select -1587 from dual
)
select mins,
to_char(sign(mins) * (trunc(abs(mins) / 60) + mod(abs(mins), 60) / 100)
, 'fm99999990d00', 'nls_numeric_characters = :,') as hours_mins
from test_data
;
MINS HOURS_MINS
---------- ------------
10 0:10
60 1:00
150 2:30
0 0:00
-15 -0:15
-120 -2:00
-150 -2:30
-1587 -26:27
在您的尝试中,您将 null
转换为 0;如果你有充分的理由,你也可以在这里做。我没有;在大多数情况下 null
不(或不应该)表示“零”。