我有一张带有时间跨度块的表。
时间跨度具有开始日期和以天为单位的长度
表中有时间间隔不重叠,例如: 2012-01-01 + 5天和2012-05-01 + 3天
并且有时间跨度重叠,例如: 2012-01-01 + 5天和2012-01-03 + 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天
以下是一个示例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做得更好?
答案 0 :(得分:0)
您的问题没有受到足够的限制,因为两个时间间隔可能会在同一天到达。在那种情况下,他们如何合并?
2012-01-01 5
2012-01-02 4
2012-01-06 3
换句话说,这个问题等同于首先从树叶遍历树。通常,要解决此问题,您需要跳出仅限SQL的解决方案,例如循环。
如果序列之间存在间隙 - 即没有重叠 - 那么问题在SQL中是可解决的。一种方法是使用日历表。第二种是使用复杂的SQL来确定是否应该将时间段与下一个时间段合并,然后找到第一个非合并时间段,然后将结果分组以将这些时间段组合在一起。