从MySql数据库中获取一个日期块的数组

3

好的,我有一个包含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数据库中提取此信息的简便方法?欢迎任何建议!


1
我建议您使用运行SQL查询的任何语言来完成此操作。在数据库级别进行此级别的处理通常不是一个好主意,这也不是数据库的本意。 - Roy Truelove
如果我理解你的问题正确,那么你应该能够使用DATEDIFF函数来实现。 - Muleskinner
2个回答

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

你要寻找的日期范围在上面显示的连续下限和上限之间。通过一些后期处理,这些范围可以很容易地找到。

谢谢大家,我找到了解决方案!正如之前建议的那样,我用PHP而不是MYSQL实现了这个。 - Simon

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接