sql >> データベース >  >> RDS >> Mysql

特定の日付範囲のMySQLクエリ

    ほぼ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つの比較 で構成されます。 。)



    1. WHERE条件の値のリストを含むパンダのread_sql

    2. 外部キー制約におけるmysql循環依存

    3. DockerのMysqlを使用したSequelPro

    4. MySQLクエリで複数の合計を選択し、それらを別々の列に表示します