Mysql
 sql >> Base de données >  >> RDS >> Mysql

Besoin d'un tableau de blocs de date de la base de données MySql

Regardez le diagramme ci-dessous qui représente certaines périodes de temps qui se chevauchent

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

Le début ou la fin de toute période de temps contiguë, marquée d'un X ne tombe dans aucune autre période. Si nous identifions ces moments, nous pouvons faire des progrès.

Cette requête identifie les limites.

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

Le résultat de cette requête sur vos données est

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

Les plages de dates que vous recherchez se situent entre les limites inférieure et supérieure consécutives indiquées ci-dessus. Avec un peu de post-traitement, ceux-ci peuvent être facilement trouvés.