Запретить создание перекрывающихся диапазонов дат - PullRequest
3 голосов
/ 09 февраля 2012

У меня есть определенное событие в календаре, назначенное для storeID с sdate (ShowDate) и hdate (HideDate). Теперь для каждого нового события с этим storeID мне нужно убедиться, что нет перекрытия с существующим периодом дат. Имеет ли это смысл? Как я могу это сделать? Я читал о вещах, но не мог понять, как «вставлять, только если не перекрывать».

1 Ответ

5 голосов
/ 03 марта 2012

Как правило, если у вас есть два диапазона с S1..E1 и S2..E2 в качестве начального и конечного значений диапазонов, тогда у вас есть перекрытие, если:

  • S1
  • S2

Это симметрично, что хорошо (и обнадеживает).Вам нужно будет тщательно решить, должны ли эти операции «меньше» быть «меньше или равны»;и то, и другое может иметь смысл, в зависимости от того, как вы храните свои данные (открытое или закрытое, полуоткрытое или открытое закрытое и закрытое открытое диапазоны и т. д.).Вы можете увидеть диаграмму возможностей по вопросу «Определить, перекрываются ли два диапазона дат» .

В вашем контексте «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 строку (из-за отсутствия перекрытия) с данными для вашего нового значения.

...