MySQL:记录之间的平均间隔

Hyd*_*erA 21 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
Run Code Online (Sandbox Code Playgroud)

如何仅使用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
Run Code Online (Sandbox Code Playgroud)

Veg*_*sen 40

直觉上,你所要求的应该等于第一个和最后一个日期之间的间隔,除以日期数减1.

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

++----+---+-+
Run Code Online (Sandbox Code Playgroud)

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

+--+--+--+--+
Run Code Online (Sandbox Code Playgroud)

要做到这一点,你只需要花费最后一天和第一天之间的天数,在这种情况下,24 - 12 = 12,并除以你必须间隔的间隔数,在这种情况下为4 : 12 / 4 = 3.

使用MySQL查询

SELECT DATEDIFF(MAX(dt), MIN(dt)) / (COUNT(dt) - 1) FROM a;
Run Code Online (Sandbox Code Playgroud)

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

CREATE TABLE IF NOT EXISTS `a` (
  `dt` date NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `a` (`dt`) VALUES
('2010-12-12'),
('2010-12-13'),
('2010-12-18'),
('2010-12-22'),
('2010-12-24');
Run Code Online (Sandbox Code Playgroud)

  • +1不遵循模式并查看问题的实际情况.:d (4认同)
  • 噢,你说得对!如果您只有时间戳而不是开始/结束对,则不需要任何聚合诡计. (2认同)