提取持续时间的等效HOUR

时间:2019-01-08 10:17:33

标签: sql oracle obiee

我具有以下日期字段格式:“ HH:MM”,其中表示事件的持续时间,我想提取HOUR中的等效值(例如:2h:30min ==>结果:2.5小时)。

致谢。

3 个答案:

答案 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解析为日期->与上述相同的日期,同一月份,同一年,但午夜的时间
  • 减去它们,得到一个浮点数,该浮点数表示两个日期时间之间一天的分数(一天是1.0,12小时是0.5等)。在这种情况下,大约为0.1041667
  • 我们乘以24将0.1041667天转换为小时-> 2.5

答案 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