Det här är hur hektiskt som helst men borde ge dig det du behöver:
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
Den innersta frågan grupperar dina perioder i överlappande grupper och sträcker ut slutdatumet där så är lämpligt. Slutdatumet flexar eftersom jag antog att det kunde finnas perioder helt inneslutna av det föregående.
Nästa radbrytningsfråga extraherar hela intervallet från varje grupp.
Den yttre frågan summerar hela månadsskillnaderna för varje grupp. Alla gruppdifferenser avrundas nedåt till närmaste hela månad med PERIOD_DIFF.
Tyvärr kunde jag inte testa detta eftersom SQLFiddle har dött på mig.