【发布时间】:2014-12-16 21:35:25
【问题描述】:
我有一个事件表,每个事件都有给定的开始和结束日期。
CREATE TABLE dataset (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
event varchar(64) NOT NULL DEFAULT '',
valid_from date DEFAULT NULL,
valid_to date DEFAULT NULL,
PRIMARY KEY (id)
);
INSERT INTO dataset (event, valid_from, valid_to) VALUES
('Test1', '2014-12-01', '2014-12-01'),
('Test2', '2014-12-02', '2014-12-02'),
('Test3', '2014-12-03', '2014-12-03'),
('Test4', '2014-12-04', '2014-12-04'),
('Test5', '2014-12-05', '2014-12-05'),
('Test6', '2014-12-01', '2014-12-01'),
('Test7', '2014-12-01', '2014-12-07');
我需要有关查询的帮助,以获取给定日期范围内的最大并发事件数。如果开始日期和结束日期相同,则使用此查询可以正常工作:
SET @d1 = '2014-12-01';
SET @d2 = '2014-12-01';
SELECT COUNT(*) as valid_events FROM dataset WHERE @d2 >= valid_from AND valid_to >= @d1;
这将返回 3,这对于匹配 Test1、Test6 和 Test7 的 12 月 1 日为真。但是,如果我扩大范围,它就会停止为我工作:
SET @d1 = '2014-12-01';
SET @d2 = '2014-12-07';
SELECT COUNT(*) as valid_events FROM dataset WHERE @d2 >= valid_from AND valid_to >= @d1;
这将返回 7,因为所有事件都与开始日期和结束日期重叠,但我希望它们仅在它们也相互重叠时才被计算在内。
Test1 Test2 Test3 Test4 Test5 Test6 Test7 Result
2014-12-01 X X X 3
2014-12-02 X X 2
2014-12-03 X X 2
2014-12-04 X X 2
2014-12-05 X X 2
2014-12-06 X 1
2014-12-07 X 1
因此,如果我请求 12 月 1 日至 7 日之间的最大并发事件数量,我希望得到 3 而不是 7 的结果。
【问题讨论】:
-
说,为了 StackOverflow 的用处,你能把你的答案写成答案,然后接受吗?
-
请注意,包含所有可能日期的日历表的开销是(令人沮丧的)微不足道的!但纯粹主义者不喜欢它们,我想我能理解为什么。
标签: mysql date concurrency count