Если у вас уже есть записи для каждого дня, которые должны работать, но если вы этого не сделаете, накладные расходы значительны, и если этот запрос используется часто, то это повлияет на производительность.
Если данные находятся вВ этом формате вы можете обнаружить перекрытия, используя простую арифметику дат, потому что перекрытие - это просто один интервал, начинающийся после заданного интервала, но до окончания заданного, что-то вроде
select dr1.* from date_ranges dr1
inner join date_ranges dr2
on dr2.start > dr1.start -- start after dr1 is started
and dr2.start < dr1.end -- start before dr1 is finished
.которые полностью находятся в другом интервале, или вам нужно объединить интервалы, то есть
PKey Start End Type
==== ===== === ====
01 01/01/2010 20/01/2010 S
02 15/01/2010 31/01/2010 S
с получением
Start End Type
===== === ====
01/01/2010 31/01/2010 S
, вам понадобятся более сложные вычисления.
По моему опытус такими проблемами, как только вы научитесь выполнять вычисления вручную, их легко перенести в SQL:)