sql >> Databáze >  >> RDS >> Mysql

Dotaz MySQL pro určité časové období

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žovatky end_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í .)



  1. Mysql jak spojit tabulky

  2. magento tabulka sales_flat_order pole protect_code vysvětlení

  3. Mohu požádat Postgresql, aby ignoroval chyby v transakci

  4. Nemohu přistupovat k nezpracované instanci PDO v Laravel 5