Oracle两个日期字段之间的平均差异

时间:2018-07-27 17:26:34

标签: sql database oracle plsql rdbms

我在数据库中有一个这样的表:

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个字段。

谢谢。

2 个答案:

答案 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格式应用于计算(某些TRUNCMOD调用是为了从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>