MySQL:将时间跨度块与SQL结合使用

时间:2012-09-28 10:14:01

标签: mysql sql date timespan

我有一张带有时间跨度块的表。
时间跨度具有开始日期和以天为单位的长度

  1. 表中有时间间隔不重叠,例如: 2012-01-01 + 5天和2012-05-01 + 3天

  2. 并且有时间跨度重叠,例如: 2012-01-01 + 5天和2012-01-03 + 3天

  3. 但是,我最感兴趣的是连续发生的那些,例如: 2012-01-01 + 5天和2012-01-06 + 3天和2012-01-09 + 13天

  4. 我需要一个通常选择1.和2.(每个条目作为单行)的查询 必须选择案例3作为单行组合,例如
    2012-01-01 + 5 天和2012-01-06 + 3 天= 2012-01-01 + 8 2012-01-01 + 5天和2012-01-06 + 3 天和2012-01-09 + 13 天= 2012-01-01 + 21天

    以下是一个示例DB:

    CREATE TABLE IF NOT EXISTS `chunks` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `start` date NOT NULL,
    `length` smallint(4) unsigned NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM ;
    
    
    INSERT INTO `chunks` (`id`, `start`, `length`) VALUES
    (1, '2012-01-01', 5),
    (2, '2012-05-01', 3),
    (3, '2012-01-03', 3),
    (4, '2012-01-06', 3),
    (5, '2012-01-09', 13);
    

    这可能与MySQL有关吗?或者以后用Java做得更好?

1 个答案:

答案 0 :(得分:0)

您的问题没有受到足够的限制,因为两个时间间隔可能会在同一天到达。在那种情况下,他们如何合并?

2012-01-01 5
2012-01-02 4
2012-01-06 3

换句话说,这个问题等同于首先从树叶遍历树。通常,要解决此问题,您需要跳出仅限SQL的解决方案,例如循环。

如果序列之间存在间隙 - 即没有重叠 - 那么问题在SQL中是可解决的。一种方法是使用日历表。第二种是使用复杂的SQL来确定是否应该将时间段与下一个时间段合并,然后找到第一个非合并时间段,然后将结果分组以将这些时间段组合在一起。