我有一个事件列表,每个事件都有一个startDate和endDate。我需要知道每个活动的平均时间。
我需要这样的东西:
select sum ( (timestamp(startDate) - timestamp(endDate)) for each event )
/ (count of events)
答案 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问题,如果需要,可以选择以下任一项:
答案 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