Bạn cũng có thể thử truy vấn này (một lần nữa các giải pháp bên cạnh các giải pháp được đưa ra bởi PM 77-1
trong bình luận ở trên):
WITH RECURSIVE cte( id, date_start, date_end ) AS
(
SELECT id, date_start, date_end
FROM evento
UNION
SELECT e.id,
least( c.date_start, e.date_start ),
greatest( c.date_end, e.date_end )
FROM cte c
JOIN evento e
ON e.date_start between c.date_start and c.date_end
OR
e.date_end between c.date_start and c.date_end
)
SELECT distinct date_start, date_end
FROM (
SELECT id,
min( date_start) date_start,
max( date_end ) date_end
FROM cte
GROUP BY id
) xx
ORDER BY date_start;
Demo ---> http://www.sqlfiddle.com/#!12/ bdf7e / 9
Tuy nhiên,
đối với bảng lớn, hiệu suất của truy vấn này có thể chậm kinh khủng và một số phương pháp tiếp cận thủ tục có thể hoạt động tốt hơn.