我有一个事件表,每个表中有一个MySQL表中的StartTime和EndTime(类型为DateTime)。MySQL中重叠日期时间范围的总和
我在输出重叠时间总和和重叠事件的数量。
在MySQL中执行此查询的最有效/最简单的方法是什么?
CREATE TABLE IF NOT EXISTS `events` (
`EventID` int(10) unsigned NOT NULL auto_increment,
`StartTime` datetime NOT NULL,
`EndTime` datetime default NULL,
PRIMARY KEY (`EventID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=37 ;
INSERT INTO `events` (`EventID`, `StartTime`, `EndTime`) VALUES
(10001, '2009-02-09 03:00:00', '2009-02-09 10:00:00'),
(10002, '2009-02-09 05:00:00', '2009-02-09 09:00:00'),
(10003, '2009-02-09 07:00:00', '2009-02-09 09:00:00');
# if the query was run using the data above,
# the table below would be the desired output
# Number of Overlapped Events | Total Amount of Time those events overlapped.
1, 03:00:00
2, 02:00:00
3, 02:00:00
这些结果的目的是生成使用小时的帐单。 (如果您有一个活动正在运行,您可能每小时支付10美元,但如果有两个活动正在运行,则只需每小时支付8美元,但仅限于您有两个活动正在运行的时间段。)
这个问题缺乏清晰度。 这样一个问题的用途是什么,你的建议有缺陷。 3小时 - 只有一个事件正在运行(3a到5a和9a到10a) 2小时 - 两个事件是(并发)运行2小时 - 所有三个事件都在运行(7a到9a) 7到9之间有3个并发事件,所以你的中间子弹是错误的,没有任何问题。 – Eddie 2009-07-20 17:42:08
我对这种困惑表示歉意,我编辑了这个问题以提高清晰度,并在问题背后增加了目的。 当你说“提案有缺陷”时,我不明白你的意思。你是绝对正确的,在7到9之间有3个并发事件,但是我的问题在上面的例子中已经提到过了(这是第3行)。 您提到的行(第2行)是5a到7a期间,而不是7a到9a。 我希望包含的SQL澄清这一点。 – maxsilver 2009-07-20 23:12:50