2014-04-29 74 views
1

我有一个事件列表,每个事件都有一个startDate和endDate。我需要知道每场比赛的平均时间。DB2 - 获得一组日期之间的平均时间

我需要的是这样的:

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

你在哪个平台上 - iSeries,LUW等?目前的答案都使用'timestampdiff(...)',这将给一个_estimate_ - 这可以使用,或者你需要一个“确切”的答案吗?有没有可能需要排除的日期? –

回答

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

+0

感谢AnfocA的回复:)我需要的结果是天/小时/分钟 – User

+0

在这种情况下,您需要运行天(16),小时(8)和分钟(4)的比较。没有函数返回这个信息。 – AngocA

+0

实际上,当您在两个日期之间做出差异时,db2会返回一个字符串,表示年,月,日,小时,分钟,秒(点)微秒的差异 – AngocA

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偏移列。如果时间戳记录在多个时区中,这也是有用的。然后可以将偏移中的差异与时间戳一起输入到计算中。
  • 提供确定性的UDF,它可以为给定的时间戳返回UTC或DST调整偏移量。如果涉及多个时区,则该区域也应该是该函数的参数。根据所涉及的地理区域,逻辑可能还需要考虑观察替代DST规则的区域。
+0

除了timestampdiff()返回一个估计值 - 30天的月份,即365天的年份,并且它忽略了DST。根据选择的分辨率和日期之间的实际距离,这可能会变得很重要。 –

+0

感谢沃伦的回复:)事实上,第二个查询计算的差异只考虑了几天,而我正在考虑全天到秒 – User

相关问题