我具有以下日期字段格式:“ HH:MM”,其中表示事件的持续时间,我想提取HOUR中的等效值(例如:2h:30min ==>结果:2.5小时)。
致谢。
答案 0 :(得分:1)
理想情况下,更改表以将数据存储为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;
输出:
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
答案 1 :(得分:0)
一种预言方式:
SELECT (TO_DATE('2h:30min', 'HH24"h":MI"min"') - TO_DATE('0:00', 'HH24:MI')) * 24.0 from dual
工作原理:
2h:30min
解析为一个日期,并生成一个日期01-JAN-19
(没有日,月,年的所有日期解析将成为当前月/年中的第一天)0:00
解析为日期->与上述相同的日期,同一月份,同一年,但午夜的时间答案 2 :(得分:0)
如果将值存储为字符串,则可以提取组件并使用算术。
提取组件的一种方法是采用前两个字符,然后是第4个和第5个字符。 regexp_substr()
提供了更多的灵活性:
select cast(regexp_substr(yyyymm, '[^:]+', 1, 1) as number) + cast(regexp_substr(yyyymm, '[^:]+', 1, 2) as number) / 60
from (select '24:30' as yyyymm from dual) x