2011-12-19 7 views
0

私はイベントのcallendarで作業しており、指定された範囲内で自分のイベントを選択するmysqlクエリを見つけることができません。私のイベントには開始日と終了日があり、範囲(月)も同じです。php mysql double date range

は私が探しています何を描くために私の最善を尽くしています(私はイベント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

イベントテーブルのテーブルスキーマはどのように指定されていますか?答えを示すためにdateRangeExampleというテーブルを作成しました。 – codeling

答えて

5

解決策は、リンク先の質問と非常によく似ています。このクエリを試してみてください。

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

あなたのコースのだろう持っているが、あなたの範囲の最初と最後の日付で[RANGE.end] [RANGE.start]置き換えるとします。たとえばRANGE.start = '2011-04-01'とRANGE.end = '2011-04-30'の場合、上記のクエリは4月11日に発生しているすべての結果を返します。あなたは、あなたが</>によって<=/>=を置き換えることができます(これらは共通の境界日を持っていますが、実際には重複しないという意味)、単に「タッチ」の範囲かどうかのイベントを選択するかによって

+0

私は今、完璧な意味を持っています – Purplefish32

+0

私はこれについて非常に大規模なクエリを作成しようとしていました。 –

3

これを実行します。

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