sql >> Database teknologi >  >> RDS >> Mysql

Har brug for en række datoblokke fra MySql-databasen

Se på diagrammet nedenfor, som repræsenterer nogle overlappende tidsperioder

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

Begyndelsen eller slutningen af ​​enhver sammenhængende tidsperiode, markeret med et X falder ikke inden for nogen anden tidsperiode. Hvis vi identificerer disse tidspunkter, kan vi gøre nogle fremskridt.

Denne forespørgsel identificerer grænserne.

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 af denne forespørgsel på dine data er

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

De datointervaller, du er ude efter, er mellem på hinanden følgende nedre og øvre grænser vist ovenfor. Med lidt efterbehandling kan disse nemt findes.



  1. SQL/doktrin-forespørgsel til at finde data med flere tilstande med mange til mange-tilknytninger

  2. T-SQL:Sletter alle duplikerede rækker, men beholder én

  3. php mysql UPDATE-kommandoen opdateres ikke

  4. Opdag fremtidige duplikerede værdier, mens du itererer gennem MySQL-resultater i PHP