Je úžasné, že si toho téměř dva roky nikdo nevšiml, ale všechny ostatní odpovědi jsou špatné protože nevzali v úvahu případ, kdy počáteční i koncové datum spadají mimo rozsah vyhledávání. Zvažte toto je rozsah dat:
start_date <<---------------------------- date range --------------------------->> end_date
A toto je rozsah našeho hledání:
start_date <<---------------------------- date range --------------------------->> end_date
start_search <<-------- search range -------->> end_search
Hledání by nám mělo dát pozitivní výsledek, protože se prolínají. Ale pokud použijete ostatní odpovědi, dostanete negativní výsledek, protože ani start_date
ani end_date
je mezi start_search
a end_search
.
Chcete-li získat řešení, nakreslete všechny 4 možné režimy křižovatky:
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
Můžete OR
všechny 4 možné případy, abyste získali jednoduché řešení:
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 */
Méně přímočaré řešení je:
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 */
Zkuste si to představit pomocí výše uvedených diagramů.
Pokud se pokusíme extrapolovat vzor ze 4 výše uvedených diagramů, uvidíme, že během křižovatkyend_date
je vždy >= start_search
a na druhé straně start_date
je vždy <= end_search
. Při další vizualizaci skutečně vidíme, že když platí tyto dvě podmínky, nemůžeme mít průsečík . Jako takové je další řešení stejně jednoduché jako:
select*from table where
end_date >= start_search && start_date <= end_search
A výhodou tohoto řešení je, že nám stačí 2 srovnání. Porovnejte to s "OR
vše“, který vyžaduje 2 až 8 (3 + 3 + 2) porovnání. (Každý between
hovor se skládá z 3 srovnání
.)