我使用 Oracle SQL,我有一个包含 3 列的表:Process
, Start Date
和 End Date
.我想计算每个进程的持续时间。
我使用了这个查询:
select
(enddate.date_value - startdate.date_value) as duration
from dual
结果是几天。
例如:开始日期是
30.3.2016 17:14:53
结束日期是 8.7.2016 14:51:21
当我使用查询时,结果是
99.90032407407407407407407407407407407407
,但我想要这样的结果:3 months, 7 days, 21 hours, 36 minutes, 28 seconds
.我怎样才能做到这一点?
最佳答案
这个复杂的查询(特别是 DAY !!):
计算正确的 Day
我加Month
和 12 * Year
到原来的日期。
with dates as(
select
sysdate as d1,
sysdate-99.90032407407407407407407407407407407407-365 as d2
from
dual
),
dates_parts as (
SELECT
d1,
d2,
EXTRACT(YEAR FROM (d1 - d2) YEAR TO MONTH ) as Year,
EXTRACT(MONTH FROM (d1 - d2) YEAR TO MONTH ) as Month,
EXTRACT(DAY FROM (d1 - d2) DAY TO SECOND ) as Day,
EXTRACT(HOUR FROM cast(d1 as timestamp) - cast(d2 as timestamp)) as Hour,
EXTRACT(MINUTE FROM cast(d1 as timestamp) - cast(d2 as timestamp)) as Minute,
EXTRACT(SECOND FROM cast(d1 as timestamp) - cast(d2 as timestamp)) as Second
FROM dates
)
select
dates_parts.Year,
dates_parts.Month,
dates_parts.Day,
dates_parts.Hour,
dates_parts.Minute,
dates_parts.Second,
EXTRACT(DAY FROM (d1 - ADD_MONTHS(d2,Month+Year*12)) DAY TO SECOND ) as Day_Corrected
from
dates_parts
将产生不同的日期部分:
| YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | DAY_CORRECTED |
|------|-------|-----|------|--------|--------|---------------|
| 1 | 3 | 464 | 21 | 36 | 28 | 7 |
关于sql - 许多天之间的人类可读的耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46970803/