理想情况下,更改您的表以将数据存储为 INTERVAL DAY TO SECOND 数据类型,然后您可以只存储 INTERVAL '2:30' HOUR TO MINUTE 并使用日期算术来获得答案。
SELECT ( DATE '1970-01-01' + your_interval_value - DATE '1970-01-01' ) * 24
FROM DUAL;
由于您存储的是字符串而不是间隔,因此您可以使用NUMTODSINTERVAL 和字符串函数将小时和分钟转换为间隔,然后使用相同的日期算术:
db小提琴here
Oracle 设置:
CREATE TABLE table_name ( value ) AS
SELECT '2h:30min' FROM DUAL UNION ALL
SELECT '15min' FROM DUAL UNION ALL
SELECT '3h' FROM DUAL UNION ALL
SELECT '26 h : 20 min' FROM DUAL UNION ALL
SELECT '-2h:30min' FROM DUAL UNION ALL
SELECT '-4h' FROM DUAL UNION ALL
SELECT '-45min' FROM DUAL UNION ALL
SELECT '0h:0min' FROM DUAL UNION ALL
SELECT '0h' FROM DUAL UNION ALL
SELECT '-0min' FROM DUAL;
查询:
SELECT value,
( DATE '1970-01-01'
+ NUMTODSINTERVAL(
CASE WHEN INSTR( value, '-' ) > 0 THEN -1 ELSE 1 END
*
TO_NUMBER( COALESCE( REGEXP_SUBSTR( value, '(\d*)\s*h', 1, 1, 'i', 1 , '0' ) ),
'HOUR'
)
+ NUMTODSINTERVAL(
CASE WHEN INSTR( value, '-' ) > 0 THEN -1 ELSE 1 END
*
TO_NUMBER( COALESCE( REGEXP_SUBSTR( value, '(\d*)\s*min', 1, 1, 'i', 1 ), '0' ) ),
'MINUTE'
)
- DATE '1970-01-01'
) * 24 AS hours_difference
FROM table_name;
输出:
价值 | HOURS_DIFFERENCE
:------------ | ----------------------------------------------------:
2 小时:30 分钟 | 2.5
15分钟 | .250000000000000000000000000000000000000008
3 小时 | 3
26 小时:20 分钟 | 26.33333333333333333333333333333333333328
-2 小时:30 分钟 | -2.5
-4 小时 | -4
-45 分钟 | -.75
0h:0min | 0
0h | 0
-0 分钟 | 0