Вы утверждаете, что пользователь указывает (в качестве примера):
- 1 недельный период
- дата начала (1 мая 2009 г.)
- дата окончания (15 мая 2009 г.)
Затем вы заявляете, что вам нужно " выяснить, есть ли интервал в одну неделю в указанном диапазоне ". Я не уверен на 100%, что если я правильно понимаю, но это то, что я получаю от этого ...
- Существует таблица «доступных периодов» (описывается датами начала / окончания)
- Вам нужно найти «период ожидания», который за кругом с датами начала / окончания пользователя
- Это перекрытие должно длиться не менее 1 недели (или любой другой продолжительности, необходимой пользователю)
Если бы это было так, я бы разработал это следующим образом ...
- Укажите периоды, которые перекрываются
- Укажите дату первого перекрытия
- Определите дату последнего перекрытия
- Если эти даты разнесены на 7 дней, это совпадение
Мое решение в SQL будет ...
SELECT
*
FROM
periods
WHERE
(range_start <= @check_end)
AND (range_end >= @check_start)
AND DATEDIFF(
DAY,
CASE WHEN range_start > @check_start THEN range_start ELSE @check_start END,
CASE WHEN range_end < @check_end THEN range_end ELSE @check_end END
)
>= @required_duration-1
EDIT
Предполагается, что даты начала и окончания являются включительными, как подразумевается в логике вашего примера.
(Однодневный период, представленный «2009 01 января» -> «2009 01 января»)
Я лично предпочитаю дату начала Inclusive, дата окончания Exclusive.
(Однодневный период, представленный «2009 01 января» -> «2009 янв 02»)
Причина в том, что различные математические сравнения и манипуляции становятся проще, но также потому, что читателю не требуется предполагать, на каком уровне точности вы работаете.
- При работе на почасовом уровне «2009 янв. 01» -> «2009 янв. 01» означает один час.
- Но '2009 Jan 01' -> '2009 Jan 02' - это всегда день, если вы знаете, что дата окончания - Эксклюзив.