MySQL:记录之间的平均间隔

时间:2010-11-30 09:04:34

标签: mysql datetime date-arithmetic

假设此表:

id    date
----------------
1     2010-12-12
2     2010-12-13
3     2010-12-18
4     2010-12-22
5     2010-12-23

如何仅使用MySQL查询找到这些日期之间的平均间隔?

例如,此表的计算将是

  (
    ( 2010-12-13 - 2010-12-12 )
  + ( 2010-12-18 - 2010-12-13 )
  + ( 2010-12-22 - 2010-12-18 )
  + ( 2010-12-23 - 2010-12-22 )
  ) / 4
----------------------------------
= ( 1 DAY + 5 DAY + 4 DAY + 1 DAY ) / 4
= 2.75 DAY

4 个答案:

答案 0 :(得分:39)

直观地说,你所要求的应该相当于第一个和最后一个日期之间的间隔,除以日期数减去1。

让我更彻底地解释一下。想象一下,日期是一行上的点(+是日期,-是缺少日期,第一个日期是第12日,我将最后日期更改为12月24日以用于说明目的):

++----+---+-+

现在,您真正想要做的是在这些行之间均匀地分隔日期,并找出它们之间的时间长度:

+--+--+--+--+

要做到这一点,你只需要花费最后一天和第一天之间的天数,在这种情况下,24 - 12 = 12,然后将它除以你必须空出的间隔数,在这种情况下为4:{ {1}}。

使用MySQL查询

12 / 4 = 3

这适用于此表(您的值返回2.75):

SELECT DATEDIFF(MAX(dt), MIN(dt)) / (COUNT(dt) - 1) FROM a;

答案 1 :(得分:2)

如果id均匀递增而没有间隙,请在id + 1:

上将表连接到自身
SELECT d.id, d.date, n.date, datediff(d.date, n.date)
FROM dates d
JOIN dates n ON(n.id = d.id + 1)

然后根据需要进行GROUP BY和平均。

如果id不统一,请执行内部查询以首先分配有序ID。

我猜你还需要添加一个子查询来获取总行数。

<强>替代地

创建一个聚合函数,用于跟踪上一个日期以及运行的总和和计数。您仍然需要从子查询中选择以按日期强制排序(实际上,我不确定这是否在MySQL中得到保证)。

想想看,这是一个更好的方法。

甚至更简单

注意到Vegard的解决方案要好得多。

答案 2 :(得分:1)

以下查询返回正确的结果

SELECT AVG(
        DATEDIFF(i.date, (SELECT MAX(date) 
                          FROM intervals WHERE date < i.date)
                 )
           )
FROM intervals i

但是它会运行一个从属子查询,它可能在没有索引且行数较多的情况下效率很低。

答案 3 :(得分:0)

您需要使用DATEDIFF函数进行自我加入并获得差异并获得平均值。