sql >> Database >  >> RDS >> Mysql

Een reeks datumblokken nodig uit MySql Database

Kijk naar het onderstaande diagram dat enkele overlappende tijdsperioden weergeeft

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

Het begin of einde van een aaneengesloten tijdsperiode, gemarkeerd met een X valt niet binnen een andere tijdsperiode. Als we deze tijden identificeren, kunnen we enige vooruitgang boeken.

Deze zoekopdracht identificeert de 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

Het resultaat van deze zoekopdracht op uw gegevens is

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

De datumbereiken die u zoekt, liggen tussen de opeenvolgende onder- en bovengrenzen die hierboven worden weergegeven. Met een beetje nabewerking zijn deze gemakkelijk te vinden.



  1. Moet ik echt SET XACT_ABORT ON gebruiken?

  2. MYSQL selecteer laatste 3 rijen, sorteer op ASC

  3. Host mag geen verbinding maken met deze MySQL-server voor client-servertoepassing

  4. Query en resultaten weergeven in een apart tabblad in SQL Server Management Studio (SSMS) - SQL Server / TSQL-zelfstudie, deel 15