Nhìn vào biểu đồ bên dưới biểu thị một số khoảng thời gian trùng lặp
X----| |--------| |------X
|-------X X------------X
|----| X----|
Đầu hoặc cuối của bất kỳ khoảng thời gian liền kề nào, được đánh dấu bằng X
không nằm trong bất kỳ khoảng thời gian nào khác. Nếu xác định được những thời điểm này, chúng ta có thể đạt được một số tiến bộ.
Truy vấn này xác định các ranh giới.
SELECT boundary FROM
(
-- find all the lower bounds
SELECT d1.StartDate AS boundary, 'lower' as type
FROM dates d1
LEFT JOIN dates d2 ON (
d1.StartDate > d2.StartDate
AND
d1.StartDate < d2.EndDate
)
WHERE d2.RowId IS NULL
GROUP BY d1.StartDate
UNION
-- find all the upper bounds
SELECT d1.EndDate AS boundary, 'upper' as type
FROM dates d1
LEFT JOIN dates d2 ON (
d1.EndDate > d2.StartDate
AND
d1.EndDate < d2.EndDate
)
WHERE d2.RowId IS NULL
GROUP BY d1.StartDate
) as boundaries
ORDER BY boundary ASC
Kết quả của truy vấn này trên dữ liệu của bạn là
Giới hạnboundry | type
------------------
2011-01-01 | lower
2011-02-20 | upper
2011-03-01 | lower
2011-04-01 | upper
Phạm vi ngày bạn đang theo đuổi nằm giữa giới hạn dưới và giới hạn trên liên tiếp được hiển thị tiếp theo. Với một chút xử lý bài đăng, bạn có thể dễ dàng tìm thấy chúng.