Рассчитать пропущенные диапазоны дат и перекрывающиеся диапазоны дат между двумя датами

У меня есть следующий набор дат (дд / мм / гггг) совпадающих событий в моей базе данных:

eventId     startDate     endDate
1           02/05/2009    10/05/2009
2           08/05/2009    12/05/2009
3           10/05/2009    12/05/2009
4           21/05/2009    21/05/2009
5           25/05/2009    NULL
6           01/06/2009    03/06/2009

События имеют дату начала и окончания (время не имеет значения), а NULL endDate означает, что событие все еще продолжается.

То, что я хотел бы определить, - это диапазоны дат между двумя произвольными датами, когда a) не было события и b) события перекрывались.

Таким образом, для диапазона дат ввода 01/04/2009 - 30/06/2009 я ожидал бы получить следующие результаты:

no event: 01/04/2009 - 01/05/2009
overlap : 08/05/2009 - 10/05/2009
overlap : 10/05/2009 - 12/05/2009
no event: 13/05/2009 - 20/05/2009
no event: 22/05/2009 - 24/05/2009
overlap : 01/06/2009 - 03/06/2009

Обратите внимание, что два соседних диапазона перекрытия будут приемлемы как один результат.

Может кто-нибудь, пожалуйста, помогите мне с алгоритмом SQL для генерации этого набора результатов?

РЕДАКТИРОВАТЬ: База данных целевой платформы SQL Server 2005. Даты записываются как 10/05/2009 00:00:00, что означает, что событие закончилось некоторое время между 5/5/2009 00:00:00 и 10/5 / 2009 23:59:59. То же самое верно для дат начала. Поэтому диапазон вводимых дат также можно прочитать как 01/04/2009 00:00:00 - 30/06/2009 23:59:59.

Ответы на вопрос(3)

Ваш ответ на вопрос