Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Summieren von Datumsbereichen ohne Zählen von Überschneidungen in mysql

Dies ist alles andere als hektisch, sollte Ihnen aber das bringen, was Sie brauchen:

SELECT SUM(PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM a.end_date), EXTRACT(YEAR_MONTH FROM a.start_date))) months
  FROM (
    SELECT MIN(g.start_date) start_date, MAX(g.end_date) end_date 
      FROM (
        SELECT @group_id := @group_id + (@end_date IS NULL OR o.start_date > @end_date) group_id,
               start_date,
               @end_date := DATE(CASE 
                 WHEN (@end_date IS NULL OR o.start_date > @end_date) THEN o.end_date
                 ELSE GREATEST(o.end_date, @end_date)
               END) end_date  
          FROM overlap o
          JOIN (SELECT @group_id := 0, @end_date := NULL) init
      ORDER BY o.start_date ASC  
            ) g
  GROUP BY  g.group_id  
        ) a

Die innerste Abfrage gruppiert Ihre Zeiträume in überlappenden Gruppen, wobei das Enddatum gegebenenfalls gestreckt wird. Das end_date biegt sich, da ich annahm, dass es Perioden geben könnte, die vollständig vom vorherigen eingeschlossen sind.

Die nächste Wrapping-Abfrage extrahiert den gesamten Bereich aus jeder Gruppe.

Die äußere Abfrage summiert die Gesamtmonatsunterschiede für jede Gruppe. Alle Gruppenunterschiede werden durch PERIOD_DIFF auf den nächsten vollen Monat abgerundet.

Leider konnte ich das nicht testen, da SQLFiddle bei mir gestorben ist.