Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Precisa de uma matriz de blocos de data do banco de dados MySql


Observe o diagrama abaixo, que representa alguns períodos de tempo sobrepostos
X----|              |--------|         |------X
    |-------X      X------------X
                         |----|     X----|

O início ou fim de qualquer período de tempo contíguo, marcado com um X não cai dentro de nenhum outro período de tempo. Se identificarmos esses tempos podemos fazer algum progresso.

Esta consulta identifica os 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

O resultado desta consulta em seus dados é
boundry    | type
------------------
2011-01-01 | lower
2011-02-20 | upper
2011-03-01 | lower
2011-04-01 | upper

Os intervalos de datas que você procura estão entre os limites inferior e superior consecutivos mostrados acima. Com um pouco de pós-processamento, eles podem ser facilmente encontrados.