DB2 - 获取一组日期之间的平均时间

时间:2014-04-29 14:52:41

标签: db2

我有一个事件列表,每个事件都有一个startDate和endDate。我需要知道每个活动的平均时间。

我需要这样的东西:

select sum ( (timestamp(startDate) -  timestamp(endDate)) for each event )
       / (count of events)

2 个答案:

答案 0 :(得分:2)

获取数值的AVG()仅具有数学意义,而不是日期时间值或持续时间。由于您希望答案精确到几分钟,因此您希望在几分钟内得到差异,然后转换回天,小时,分钟。 (标准日有24 * 60 = 1440分钟。)

with q as
(select avg(
             timestampdiff(4, char(endDate - startDate) )
           )  as avgmns
  from yourChosenData
)
select int(avgmns / 1440) as avg_days,
       int( mod(avgmns,1440) / 60) as avg_mins,
       mod(avgmns, 60) as avg_secs
  from q

如下所述,timestampdiff()是一个估计值。为避免此问题,可以使用更准确的计算。

with q as
(select avg(
             ( days(endDate) - days(startDate) ) * 1440
           + ( midnight_seconds(endDate) - midnight_seconds(startDate) ) / 60
           )  as avgmns
  from yourChosenData
)
select int(avgmns / 1440) as avg_days,
       int( mod(avgmns,1440) / 60) as avg_mins,
       mod(avgmns, 60) as avg_secs
  from q

为了解决DST问题,如果需要,可以选择以下任一项:

  • 包括与每个时间戳字段对应的UTC偏移列。如果在多个时区中记录timstamp,这也很有用。然后可以将偏移的差异与时间戳一起输入计算中。
  • 提供确定性UDF,该UDF可以返回给定时间戳的UTC或DST调整偏移量。如果涉及多个时区,则该区域也应该是该函数的参数。根据所涉及的地理区域,逻辑可能还需要考虑观察替代DST规则的区域。

答案 1 :(得分:1)

你必须小心分母以防止0分裂:SQL0802 - Data Conversion or Data Mapping Error

根据结果的精确度,您需要转换日期。我们假设你需要秒(2)

select 
  sum ( timestampdiff(2, endDate - startDate))
  /
  sum (count of events)
from yourTable

http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0000861.html