我有一个事件列表,每个事件都有一个startDate和endDate。我需要知道每场比赛的平均时间。DB2 - 获得一组日期之间的平均时间
我需要的是这样的:
select sum ((timestamp(startDate) - timestamp(endDate)) for each event)
/(count of events)
我有一个事件列表,每个事件都有一个startDate和endDate。我需要知道每场比赛的平均时间。DB2 - 获得一组日期之间的平均时间
我需要的是这样的:
select sum ((timestamp(startDate) - timestamp(endDate)) for each event)
/(count of events)
你要小心分母,以防止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
它不仅使数学意义上取数值的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,如果需要的话,我们可以选择任何一种:
除了timestampdiff()返回一个估计值 - 30天的月份,即365天的年份,并且它忽略了DST。根据选择的分辨率和日期之间的实际距离,这可能会变得很重要。 –
感谢沃伦的回复:)事实上,第二个查询计算的差异只考虑了几天,而我正在考虑全天到秒 – User
你在哪个平台上 - iSeries,LUW等?目前的答案都使用'timestampdiff(...)',这将给一个_estimate_ - 这可以使用,或者你需要一个“确切”的答案吗?有没有可能需要排除的日期? –