如何找到日期之间的平均差距?

时间:2012-10-23 15:46:08

标签: mysql sql

我有项目表,每个人都有它的开始时间和结束时间。

例如:

| id      | item | start      | end        |
+---------+------+------------+------------+
|    2703 | 223  | 2003-12-30 | 2004-01-16 |
|   47029 | 223  | 2004-04-21 | 2005-01-06 |
| 1386593 | 223  | 2005-04-19 | 2005-04-19 |
| 1386739 | 223  | 2005-04-19 | 2006-12-07 |
| 1432862 | 223  | 2006-02-08 | 2006-02-10 |

我想找出项目之间的差距(从一个结束到下一个开始之间的天数)。示例中前两项之间的差距为93天,最后两项之间的差距为302天,计为零。因此,示例表的差距是:

96
103
0
0

我的目标是找到平均差距(本例中为49.75)或其他字间隔天数(199)。

可选目标:最小间隙(0)和最大间隙(103)。

我现在的解决方案是遍历行并在数据库外计算它,但我正在寻找快速解决方案(在MySQL内部)。我查看了聚合函数,但不知道这是否可能。找到这种平均差距的最佳方法是什么?

6 个答案:

答案 0 :(得分:4)

select avg(if (diff < 0, 0, diff))
from (
    select datediff(min(t2.start), t1.end) as diff
    from Table1 t1
    inner join Table1 t2 on t1.id < t2.id
    group by t1.end
) a

SQL Fiddle Example

答案 1 :(得分:1)

SELECT DATEDIFF(开始,结束)AS average_gap FROM table

来自MySQL文档的@see DATEDIFF()

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_datediff

返回天数。该方法是减法,因此您需要处理SQL之外的否定。否则,您可以执行AVG(DATEDIFF(start, end))

编辑:

你可以做到

AVG(GREATEST(DATEDIFF(start,end), 0))

答案 2 :(得分:0)

DATEDIFFAVG

的组合怎么样?

这样你就可以做SELECT AVG(DATEDIFF(开始,结束))AS间隙

编辑:dang,击败拳! :P

答案 3 :(得分:0)

这不是你纯粹在SQL查询中完成的事情,你将不得不将数据带入你的应用程序并确定这些间隔中的间隙和重叠。

这不会是一个微不足道的代码,但编写它应该很有趣。我建议循环遍历列表并将所有相交的间隔加在一起,直到留下一个或多个非相交的间隔,您可以用它来计算间隙。

答案 4 :(得分:0)

select avg(diff) FROM 
( select @rt:=NULL, 
         @rt := if(datediff(start, @end)<0,0,datediff(start, @end)) diff, 
         @end := end from t) t;

答案 5 :(得分:0)

这(在某些情况下)可以通过SQL解决。我会使用此VIEW查找所有间隔:

CREATE VIEW items_intervals AS
SELECT
  items.end,
  min(items_1.start) as start
FROM
  items inner join items items_1 on items_1.id > items.id
GROUP BY
  items.end

现在你所要做的就是聚合数据:

SELECT
  min(greatest(0,datediff(start,end))),
  max(greatest(0,datediff(start,end))),
  sum(greatest(0,datediff(start,end))),
  avg(greatest(0,datediff(start,end)))
FROM
  items_intervals

当然,您可以将两个查询合并为一个,但我更喜欢将它们分开,它们更容易阅读。

这些查询只有在使用id正确排序记录时才有效,否则不会!