php mysql双日期范围

时间:2011-12-19 10:00:03

标签: php mysql date range

我正在开发一个事件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但我不认为这是重复的,好像我在我的问题中正确理解范围有开始和结束日期,而在另一个问题中,范围是单个日期。

2 个答案:

答案 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');