当您从另一个the result is an interval 中减去一个时间戳时。你可以看到的值,1 8:8:41.0,代表 1 天 8 小时 8 分钟 41 秒。不清楚为什么您认为结果应该是该结果的两倍,但将该值解释为 16:17:22 是不正确的。
作为一个带有两个发明时间戳的快速演示:
with archivo (no, datetime) as (
select 256, timestamp '2015-08-14 11:37:16' from dual
union all select 256, timestamp '2015-08-13 03:28:35' from dual
)
select ARC.NO, MIN(ARC.DATETIME) AS MIN_DATETIME, MAX(ARC.DATETIME) AS MAX_DATETIME,
MAX(ARC.DATETIME)-MIN(ARC.DATETIME) AS HORAS_TRABAJADAS
from archivo ARC GROUP BY ARC.NO;
NO MIN_DATETIME MAX_DATETIME HORAS_TRABAJADAS
---------- --------------------- --------------------- -----------------------------
256 2015-08-13 03:28:35.0 2015-08-14 11:37:16.0 +000000001 08:08:41.000000000
如果您想以不同的格式显示间隔,则需要提取其组件,例如:
select NO,
EXTRACT(day FROM HORAS_TRABAJADAS) || ' days, '
|| EXTRACT(hour FROM HORAS_TRABAJADAS) || ' hours, '
|| EXTRACT(minute FROM HORAS_TRABAJADAS) || ' minutes and '
|| EXTRACT(second FROM HORAS_TRABAJADAS) || ' seconds'
AS HORAS_TRABAJADAS
from (
select ARC.NO, MAX(ARC.DATETIME)-MIN(ARC.DATETIME) AS HORAS_TRABAJADAS
from archivo ARC GROUP BY ARC.NO
)
NO HORAS_TRABAJADAS
---------- --------------------------------------------------
256 1 day, 8 hours, 8 minutes and 41 seconds
我使用内联视图来避免重复最大-最小值计算,但这是可选的。
或者将天数添加为 24 小时的倍数:
select NO,
24 * EXTRACT(day FROM HORAS_TRABAJADAS) + EXTRACT(hour FROM HORAS_TRABAJADAS)
|| ':' || LPAD(EXTRACT(minute FROM HORAS_TRABAJADAS), 2, '0')
|| ':' || LPAD(EXTRACT(second FROM HORAS_TRABAJADAS), 2, '0')
AS HORAS_TRABAJADAS
from (
select ARC.NO, MAX(ARC.DATETIME)-MIN(ARC.DATETIME) AS HORAS_TRABAJADAS
from archivo ARC GROUP BY ARC.NO
);
NO HORAS_TRABAJADAS
---------- ----------------
256 32:08:41
不幸的是,没有一个简单的to_char() 等价于间隔。