Как правило, если у вас есть два диапазона с S1..E1 и S2..E2 в качестве начального и конечного значений диапазонов, тогда у вас есть перекрытие, если:
Это симметрично, что хорошо (и обнадеживает).Вам нужно будет тщательно решить, должны ли эти операции «меньше» быть «меньше или равны»;и то, и другое может иметь смысл, в зависимости от того, как вы храните свои данные (открытое или закрытое, полуоткрытое или открытое закрытое и закрытое открытое диапазоны и т. д.).Вы можете увидеть диаграмму возможностей по вопросу «Определить, перекрываются ли два диапазона дат» .
В вашем контексте «ShowDate» соответствует началуdate, а «HideDate» соответствует дате окончания.
Звучит так, как будто вы хотите «условную вставку» тоже.В этом случае, если ваш StoreID равен 1001, ShowDate - 2012-03-21, а HideDate - 2012-03-28, тогда вы можете написать:
INSERT INTO Calendar(StoreID, ShowDate, HideDate, ...)
SELECT 1001, '2012-03-21', '2012-03-28', ...
FROM Dual
WHERE NOT EXISTS(SELECT * FROM Calendar C2
WHERE C2.StoreID = 1001
AND C2.ShowDate < '2012-03-28'
AND '2012-03-21' < C2.HideDate
);
Значения в списке SELECTэто те, которые вы хотите добавить в таблицу календаря.Подвыбор означает, что вы получаете либо 0 строк (из-за перекрытия), либо 1 строку (из-за отсутствия перекрытия) с данными для вашего нового значения.