Dette er hektisk som noget, men burde give dig det, du har brug for:
SELECT SUM(PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM a.end_date), EXTRACT(YEAR_MONTH FROM a.start_date))) months FROM (VÆLG 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 STØRSTE(o.end_date, @end_date) END) end_date FROM overlap o JOIN (SELECT @group_id :=0, @end_date :=NULL) init BESTILLE BY o.start_date ASC ) g GROUP BY g.group_id ) a
Den inderste forespørgsel grupperer dine perioder i overlappende grupper, der strækker slutdatoen, hvor det er relevant. Slutdatoen bøjer sig, da jeg antog, at der kunne være perioder fuldstændig omsluttet af den foregående.
Den næste ombrydningsforespørgsel udtrækker hele spektret fra hver gruppe.
Den ydre forespørgsel opsummerer de fulde månedsforskelle for hver gruppe. Alle gruppeforskelle rundes ned til nærmeste hele måned med PERIOD_DIFF.
Desværre kunne jeg ikke teste dette, da SQLFiddle er død på mig.