简体   繁体   English

PHP MySQL的双日期范围

[英]php mysql double date range

I am working on an event callendar and am having trouble finding a mysql query that selects my events within a given range. 我正在处理一个事件callendar,但找不到用于在给定范围内选择我的事件的mysql查询时遇到麻烦。 My events have start/end dates and so do my ranges (Months). 我的活动有开始/结束日期,我的活动范围(月)也有。

I have tried my best to depict what I am looking for : (I want to select events 1,2,3,4 but not 5 or 6) 我已经尽力描述了我要寻找的内容:(我想选择事件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

I have found this similar quastion : 2 Column Mysql Date Range Search in PHP but I dont think this is a duplicate as if I understand correcly in my problem the range has start and end dates and in the other question the range is a single date. 我发现了类似的问题: 在PHP中使用2列Mysql日期范围搜索,但是我不认为这是重复的,好像我正确地理解了我的问题中范围的开始和结束日期,而在另一个问题中,范围是单个日期。

The solution is still very similar to the question you're linking to; 解决方案仍然与您要链接的问题非常相似。 try this query: 试试这个查询:

SELECT * FROM events e
    WHERE `start` <= [RANGE.end]
    AND `end`  >= [RANGE.start]

You'd of course have to replace [RANGE.start] and [RANGE.end] by the first and last date of your range. 当然,您必须用范围的第一个和最后一个日期替换[RANGE.start]和[RANGE.end]。 If eg RANGE.start = '2011-04-01' and RANGE.end = '2011-04-30', the above query will give all results which are happening in April '11. 如果例如RANGE.start ='2011-04-01'和RANGE.end ='2011-04-30',则上面的查询将给出所有在11年4月发生的结果。

Depending on whether you want to select events which just "touch" the range (meaning they have a common border date, but do not actually overlap) or not, you can replace <= / >= by < / > . 根据您是否要选择事件,只是“触摸”的范围内(这意味着他们有一个共同的边界日期,但实际上并不重叠)或没有,你可以替换<= / >=< / >

Give this a go. 快去 I made up a table called dateRangeExample to illustrate the answer: 我制作了一个名为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');

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM