我在数据库中有一个这样的表:
unit arrival_date departure_date
---- ------------- --------------
1 27/1/2017 08:01:20 a. m. 27/1/2017 08:04:27 a. m.
1 27/1/2017 08:05:35 a. m. 27/1/2017 08:09:28 a. m.
我需要计算用户的到达日期和离开日期之间的平均时差,并将结果显示为小时,分钟,秒格式(HH:MI:SS)。
如果我做这个arrival_date - departure_date
我可以在几天之内得到结果,但是我在努力获取小时,分钟和秒的平均值。
这些字段是DATE
个字段,而不是TIMESTAMP
个字段。
谢谢。
答案 0 :(得分:0)
select unit, avg(departure_date - arrival_date) as avg_date
from mytable
答案 1 :(得分:0)
这是一个例子。
当减去两个日期数据类型值时,结果为天数。它显示了INTER
CTE。将其乘以24(一天中的小时数),60(每小时中的分钟数)和60(分钟中的秒数)时,结果为秒数(DIFF_SECS
)。 / p>
AVERAGES
CTE显示了如何将AVG
函数应用于先前的结果;没什么特别的,只需注意您必须GROUP
BY
UNIT
列中。
最后,将TO_CHAR
格式应用于计算(某些TRUNC
和MOD
调用是为了从AVG_DIFF_SECS
值中提取小时,分钟和秒)。
我建议您逐步运行每个CTE,以更轻松地执行代码。希望对您有所帮助。
SQL> with test (unit, arr, dep) as
2 (select 1, to_date('27.01.2017 08:01:20', 'dd.mm.yyyy hh24:mi:ss'),
3 to_date('27.01.2017 08:04:27', 'dd.mm.yyyy hh24:Mi:ss')
4 from dual union all
5 select 1, to_date('27.01.2017 08:05:35', 'dd.mm.yyyy hh24:mi:ss'),
6 to_date('27.01.2017 08:09:28', 'dd.mm.yyyy hh24:Mi:ss')
7 from dual
8 ),
9 inter as
10 (select unit, (dep - arr) diff_days,
11 (dep - arr) * 24 * 60 * 60 diff_secs
12 from test
13 ),
14 averages as
15 (select unit,
16 avg(dep - arr) avg_diff_days,
17 avg((dep - arr) * 24 * 60 * 60) avg_diff_secs
18 from test
19 group by unit
20 )
21 select
22 to_char(trunc(avg_diff_secs / 3600), 'fm00') || ':' || -- hours
23 to_char(trunc(mod(avg_diff_secs , 3600) / 60), 'fm00') || ':' || -- minutes
24 to_char(mod(avg_diff_secs, 60), 'fm00') -- seconds
25 avg_diff_formatted
26 from averages;
AVG_DIFF_FORMATTED
--------------------
00:03:30
SQL>