2012-02-09 6 views
1

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

+0

Добро пожаловать в StackOverflow. Какой «календарь»? Какой язык? Какая база данных? что ты уже испробовал? Вы не предоставляете какую-либо информацию здесь, которую мы можем использовать, чтобы попытаться помочь вам. Измените свой вопрос и укажите более подробную информацию. Боюсь, если вы этого не сделаете, этот вопрос в конечном итоге будет закрыт как «не настоящий вопрос». –

+0

Извините, PHP и MySql - я пробовал играть с BETWEEN, но на самом деле не получил этого, также, могу ли я использовать между php? – cerr

ответ

3

В общем, если у вас есть два диапазона с S1..E1 и S2..E2 как начальными и конечными значениями диапазонов, то у Вас есть перекрытие, если:

  • S1 < E2 и
  • S2 < Е1

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

В вашем контексте «ShowDate» соответствует дате начала, а «HideDate» соответствует дате окончания.

Звучит так же, как если бы вы тоже делали 'conditional insert'. В этом случае, при условии, что ваш 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 
        ); 

Значения в списке выбора являются те, вы хотите добавить в таблицу календаря. Суб-выбор означает, что вы получаете либо 0 строк (потому что есть перекрытие), либо 1 строка (потому что нет перекрытия) с данными для вашего нового значения.

+0

Почему 'SELECT ... FROM Dual' вместо кортежа' (1001, '2012-03-21', '2012-03-28', ...) '? – Air

+0

Диалект SQL (или стандарт, которому соответствует СУБД). Некоторые СУБД не поддерживают обозначение. –

Смежные вопросы