我正在开发一个事件callendar,我很难找到一个mysql查询来选择我在给定范围内的事件。我的活动有开始/结束日期,我的范围也是如此(月)。
我尽力描绘我想要的东西:(我想选择事件1,2,3,4而不是5或6)
|========= April ===========| => Range
+--(1)--+ +--(2)--+ => Partialy Overlapping Events
+--(3)--+ => Events included in range
+----------------(4)----------------+ => Ovelapping events
+-(5)-+ +-(6)-+ => Events outside of range
我发现了这个类似的假设:2 Column Mysql Date Range Search in PHP但我不认为这是重复的,好像我在我的问题中正确理解范围有开始和结束日期,而在另一个问题中,范围是单个日期。
答案 0 :(得分:5)
解决方案仍然非常类似于您要链接的问题;试试这个查询:
SELECT * FROM events e
WHERE `start` <= [RANGE.end]
AND `end` >= [RANGE.start]
您当然必须将[RANGE.start]和[RANGE.end]替换为您的范围的第一个和最后一个日期。如果是RANGE.start =&#39; 2011-04-01&#39;和RANGE.end =&#39; 2011-04-30&#39;,上述查询将给出4月和11日发生的所有结果。
取决于您是否要选择仅触摸&#34;的事件。范围(意味着它们具有共同的边界日期,但实际上不重叠)或不是,您可以将<=
/ >=
替换为<
/ >
。
答案 1 :(得分:3)
放手一搏。我编写了一个名为dateRangeExample
的表来说明答案:
drop table if exists dateRangeExample;
create table dateRangeExample
(id int unsigned primary key,
startDate date not null,
endDate date not null
);
insert into dateRangeExample (id,startDate,endDate) values (1,'2011-03-15','2011-04-05');
insert into dateRangeExample (id,startDate,endDate) values (2,'2011-04-25','2011-05-05');
insert into dateRangeExample (id,startDate,endDate) values (3,'2011-04-10','2011-04-15');
insert into dateRangeExample (id,startDate,endDate) values (4,'2011-03-15','2011-05-05');
insert into dateRangeExample (id,startDate,endDate) values (5,'2011-03-01','2011-03-20');
insert into dateRangeExample (id,startDate,endDate) values (6,'2011-05-03','2011-05-25');
select dre.*
from dateRangeExample dre
where startDate between '2011-04-01' and '2011-04-30'
or endDate between '2011-04-01' and '2011-04-30'
or (startDate < '2011-04-01' and endDate > '2011-04-30');