В идеале измените таблицу, чтобы хранить данные как тип данных 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
и строковые функции для преобразования часов и минут в интервалы, а затем использовать ту же арифметику даты:
дБ <> скрипка здесь
Установка 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;
выход
VALUE | HOURS_DIFFERENCE
:------------ | ----------------------------------------:
2h:30min | 2.5
15min | .2500000000000000000000000000000000000008
3h | 3
26 h : 20 min | 26.33333333333333333333333333333333333328
-2h:30min | -2.5
-4h | -4
-45min | -.75
0h:0min | 0
0h | 0
-0min | 0