0

我有一张带有时间跨度块的桌子。
时间跨度具有开始日期和天数

  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 天

我需要一个通常选择 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 天

这是一个示例数据库:

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更好地完成?

4

1 回答 1

0

您的问题没有受到足够的约束,因为两个间隔可能在同一日期到达。在这种情况下,它们如何合并?

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

换句话说,这个问题相当于遍历一棵树,先从叶子开始。一般来说,要解决这个问题,您需要跳出仅使用 SQL 的解决方案,例如循环。

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

于 2012-09-28T13:45:20.677 回答