Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Benötigen Sie ein Array von Datumsblöcken aus der MySql-Datenbank

Sehen Sie sich das folgende Diagramm an, das einige sich überschneidende Zeiträume darstellt

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

Der Beginn oder das Ende eines zusammenhängenden Zeitraums, gekennzeichnet mit einem X fällt in keinen anderen Zeitraum. Wenn wir diese Zeiten identifizieren, können wir Fortschritte machen.

Diese Abfrage identifiziert die Grenzen.

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

Das Ergebnis dieser Abfrage Ihrer Daten ist

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

Die Datumsbereiche, nach denen Sie suchen, liegen zwischen den oben gezeigten aufeinanderfolgenden unteren und oberen Grenzen. Mit ein wenig Nachbearbeitung können diese leicht gefunden werden.