ほぼ2年間、誰もこれに気づいていないのは驚くべきことですが、他の答えはすべて間違っています 開始日と終了日の両方が検索範囲の範囲を超えている場合を考慮していなかったためです。これが日付の範囲であると考えてください:
start_date <<---------------------------- date range --------------------------->> end_date
そして、これが私たちの検索範囲です:
start_date <<---------------------------- date range --------------------------->> end_date
start_search <<-------- search range -------->> end_search
それらが交差するので、検索は私たちに肯定的な結果を与えるはずです。ただし、他の回答を使用すると、どちらもstart_date
ではないため、否定的な結果が得られます。 また、end_date
start_search
の間にあります およびend_search
。
解決策を得るために、4つの可能なモードをすべて描きましょう。 交差点の:
start_date <<---------- date range --------------------------->> end_date start_search <<------------------------- search range -------->> end_search
start_date <<---------------------------- date range ---------->> end_date start_search <<---------- search range ------------------------>> end_search
start_date <<---------------------------- date range --------------------------->> end_date start_search <<-------- search range -------->> end_search
start_date <<----------- date range -------->> end_date start_search <<------------------------- search range ------------------------>> end_search
OR
できます 簡単な解決策を得るには、考えられる4つのケースすべて:
select*from table where
/* 1st case */ start_date between start_search and end_search
or /* 2nd case */ end_date between start_search and end_search
or /* 3rd case */ (start_date <= start_search and end_date >= end_search)
or /* 4th case */ (start_date >= start_search and end_date <= end_search)
/* the 4th case here is actually redundant since it is being covered by the 1st and 2nd cases */
それほど単純ではない解決策は次のとおりです。
select*from table where start_date between start_search and end_search /* covers 1st and 4th cases */ or start_search between start_date and end_date /* covers 2nd and 3rd cases */
上の図を使用して視覚化してみてください。
上記の4つの図からパターンを推定しようとすると、交差点でend_date
であることがわかります。 常に>= start_search
です 、反対に、start_date
常に<= end_search
です 。実際、さらに視覚化すると、これらの2つの条件が成立する場合、交差点を持つことはできませんことがわかります。 。 そのため、別の解決策は次のように単純です。
select*from table where
end_date >= start_search && start_date <= end_search
そして、このソリューションの利点は、2つの比較だけが必要なことです。 「OR
」と比較してください 2から最大8(3&plus; 3&plus; 2)の比較を必要とする「すべて」のアプローチ。(各between
通話は、3つの比較
で構成されます。 。)