Посмотрите на диаграмму ниже, которая представляет некоторые перекрывающиеся периоды времени
X----| |--------| |------X
|-------X X------------X
|----| X----|
Начало или конец любого непрерывного периода времени, отмеченного X
, не попадает ни в какой другой период времени. Если мы определим эти времена, мы сможем добиться определенного прогресса.
Этот запрос определяет границы.
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
Результат этого запроса к вашим данным
boundry | type
------------------
2011-01-01 | lower
2011-02-20 | upper
2011-03-01 | lower
2011-04-01 | upper
Диапазон дат, после которого вы находитесь, находится между последовательными нижними и верхними границами, показанными сверху. С небольшой постобработкой их легко найти.