2011-12-19 7 views
0

Я работаю над календарями событий, и мне трудно найти запрос mysql, который выбирает мои события в заданном диапазоне. Мои события имеют даты начала и окончания, а также мои диапазоны (месяцы).php 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 

я нашел подобную quastion: 2 Column Mysql Date Range Search in PHP, но я не думаю, что это дубликат, как если бы я правильно понимал в своей проблеме диапазон с датами начала и окончания, а в другом вопросе диапазон - это единственная дата.

+0

Как ваш диапазон задан, какова схема вашей таблицы для таблицы событий? – codeling

ответ

5

Решение по-прежнему очень похоже на вопрос, на который вы ссылаетесь; попробуйте этот запрос:

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

Вы бы, конечно, придется заменить [RANGE.start] и [RANGE.end] первой и последней датой вашего диапазона. Если, например, RANGE.start = '2011-04-01' и RANGE.end = '2011-04-30', приведенный выше запрос даст все результаты, которые происходят в апреле '11.

В зависимости от того, хотите ли вы, чтобы выбрать события, которые просто «касание» диапазон (то есть они имеют общую дату границы, но на самом деле не перекрываются) или нет, вы можете заменить <=/>= по </>.

+0

Я вижу сейчас, имеет смысл – Purplefish32

+0

Я пытался сделать ОЧЕНЬ БОЛЬШОЙ запрос для этого, и вы спасли меня много времени, спасибо. –

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'); 
Смежные вопросы