У меня есть следующий набор дат (дд / мм / гггг) соответствующих событий в моей базе данных:
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.