需要MySql数据库中的日期块数组

时间:2011-11-15 22:10:37

标签: mysql sql gaps-and-islands

好的,我有一个包含StartDate和EndDate的行的数据库表。我需要做的是从那里返回消耗时间的块。

因此,例如,如果我有3行,如下所示:

RowID  StartDate   EndDate
1      2011-01-01  2011-02-01
2      2011-01-30  2011-02-20
3      2011-03-01  2011-04-01

然后使用时间块如下:

  

2011-01-01至2011-02-20及2011-03-01至2011-04-01

是否有一种从MySql数据库中提取的简单方法?欢迎任何建议!

2 个答案:

答案 0 :(得分:2)

请看下面的图表,它代表了一些重叠的时间段

X----|              |--------|         |------X
    |-------X      X------------X
                         |----|     X----|

标有X的任何连续时间段的开头或结尾都不属于任何其他时间段。如果我们确定这些时间,我们可以取得一些进展。

此查询标识边界。

SELECT boundary FROM
(

-- find all the lower bounds
    SELECT d1.StartDate AS boundary, 'lower' as type
    FROM dates d1
    LEFT JOIN dates d2 ON ( 
        d1.StartDate > d2.StartDate
        AND 
        d1.StartDate < d2.EndDate
    )
    WHERE d2.RowId IS NULL
    GROUP BY d1.StartDate

UNION

-- find all the upper bounds
    SELECT d1.EndDate AS boundary, 'upper' as type
    FROM dates d1
    LEFT JOIN dates d2 ON ( 
        d1.EndDate > d2.StartDate
        AND 
        d1.EndDate < d2.EndDate 
    )
    WHERE d2.RowId IS NULL
    GROUP BY d1.StartDate
) as boundaries

ORDER BY boundary ASC

此查询对您的数据的结果是

boundry    | type
------------------
2011-01-01 | lower
2011-02-20 | upper
2011-03-01 | lower
2011-04-01 | upper

您所追踪的日期范围介于上方显示的连续下限和上限之间。通过一些后处理,可以很容易地找到它们。

答案 1 :(得分:0)

您是否尝试过mysql group concat

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

它将返回逗号分隔的字符串,但您仍然必须将其初始化为应用程序中的数组。