· 6 years ago · Jul 05, 2019, 01:02 PM
1CREATE TABLE IF NOT EXISTS overlap (
2 id INT AUTO_INCREMENT,
3 start_date DATE,
4 end_date DATE,
5 PRIMARY KEY (id)
6) ENGINE=INNODB;
7
8SELECT SUM(PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM a.end_date), EXTRACT(YEAR_MONTH FROM a.start_date))) months
9 FROM (
10 SELECT MIN(g.start_date) start_date, MAX(g.end_date) end_date
11 FROM (
12 SELECT @group_id := @group_id + (@end_date IS NULL OR o.start_date > @end_date) group_id,
13 start_date,
14 @end_date := DATE(CASE
15 WHEN (@end_date IS NULL OR o.start_date > @end_date) THEN o.end_date
16 ELSE GREATEST(o.end_date, @end_date)
17 END) end_date
18 FROM overlap o
19 JOIN (SELECT @group_id := 0, @end_date := NULL) init
20 ORDER BY o.start_date ASC
21 ) g
22 GROUP BY g.group_id
23 ) a