sql >> Databasteknik >  >> RDS >> Mysql

Behöver en mängd datumblock från MySql Database

Titta på diagrammet nedan som representerar några överlappande tidsperioder

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

Början eller slutet av en sammanhängande tidsperiod, markerad med ett X faller inte in i någon annan tidsperiod. Om vi ​​identifierar dessa tider kan vi göra vissa framsteg.

Den här frågan identifierar gränserna.

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

Resultatet av denna fråga på dina data är

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

Datumintervallen du är ute efter är mellan på varandra följande nedre och övre gränser som visas ovan. Med lite efterbearbetning kan dessa lätt hittas.



  1. Hur man väljer en användarvänlig databas för ditt företag

  2. Hur kan jag sakta ner en MySQL-dump för att inte påverka nuvarande belastning på servern?

  3. UnboundLocalError:lokal variabel 'cursor' som refereras till före tilldelning

  4. MySQL-namnkonventioner, ska fältnamnet inkludera tabellnamnet?