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

MySqlデータベースからの日付ブロックの配列が必要

    いくつかの重複する期間を表す下の図を見てください

    X----|              |--------|         |------X
        |-------X      X------------X
                             |----|     X----|
    

    Xでマークされた連続する期間の開始または終了 他の期間には含まれません。これらの時間を特定すれば、ある程度の進歩を遂げることができます。

    このクエリは境界を識別します。

    SELECT boundary FROM
    (
    
    -- find all the lower bounds
        SELECT d1.StartDate AS boundary, 'lower' as type
        FROM dates d1
        LEFT JOIN dates d2 ON ( 
            d1.StartDate > d2.StartDate
            AND 
            d1.StartDate < d2.EndDate
        )
        WHERE d2.RowId IS NULL
        GROUP BY d1.StartDate
    
    UNION
    
    -- find all the upper bounds
        SELECT d1.EndDate AS boundary, 'upper' as type
        FROM dates d1
        LEFT JOIN dates d2 ON ( 
            d1.EndDate > d2.StartDate
            AND 
            d1.EndDate < d2.EndDate 
        )
        WHERE d2.RowId IS NULL
        GROUP BY d1.StartDate
    ) as boundaries
    
    ORDER BY boundary ASC
    

    データに対するこのクエリの結果は

    です。
    boundry    | type
    ------------------
    2011-01-01 | lower
    2011-02-20 | upper
    2011-03-01 | lower
    2011-04-01 | upper
    

    対象となる日付範囲は、上記の連続する下限と上限の間にあります。少し後処理を行うだけで、これらを簡単に見つけることができます。



    1. データローカル入力ファイルのロードphpmysql

    2. 他のテーブルから最大値を結合するための最良かつ最適な方法

    3. JavaFXUIおよびJDBCアプリケーションの操作

    4. Python:MySQL接続は開いていますが、カーソルを作成できません