【问题标题】:Split overlapping dates into different records将重叠的日期拆分为不同的记录
【发布时间】:2015-11-13 07:15:08
【问题描述】:

我正在开发一个 PHP + MySQL 应用程序。我有一个表格,其中包含期间的开始日期和结束日期。期间可以重叠。示例:

ID   Start       End
1    01/05/2015  31/05/2015
2    01/06/2015  30/06/2015
3    15/06/2015  25/06/2015 (this record overlaps record with ID 2)
4    17/06/2015  22/06/2015 (this record overlaps records with IDs 2 and 3)

我需要选择所有记录,按开始日期和结束日期排序,还需要拆分重叠记录并保留它们的 ID。我的意思是我最终需要得到这个:

ID   Start       End
1    01/05/2015  31/05/2015
2    01/06/2015  14/06/2015
3    15/06/2015  16/06/2015
4    17/06/2015  22/06/2015
3    23/06/2015  25/06/2015
2    26/06/2015  30/06/2015

我可以通过选择所有句点然后在 PHP 中对它们进行排序/拆分来做到这一点,但我想知道我是否可以在数据库层上做到这一点?

请至少有人能指出我正确的方向吗?

【问题讨论】:

    标签: mysql select overlapping-matches


    【解决方案1】:

    我认为你必须用 PHP(或者可能是一个 db 程序,但我不会在 db 层这样做),它会更容易。您必须考虑多种组合,它们不能放入单个 SQL 语句中。

    这是如何发现重叠的示例(至少这是我可以帮助您的方式):

    SELECT  t1.id, t1.start, t1.id, t2.id
    FROM    T t1, T t2
    WHERE   (t2.start BETWEEN t1.start AND t1.end
            OR t2.end BETWEEN t1.start AND t1.end)
            AND t2.id > t1.id
    

    DEMO HERE

    【讨论】:

    • 我想远离数据库程序,因为如果我遇到一些错误,它们就很难调试。我想我将不得不采用 PHP 方式
    • 没错,我也不喜欢调试数据库程序。所以应用层似乎是最好的方法。
    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 2014-01-14
    • 2021-05-29
    • 2021-01-14
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多