Регистрация  |  Вход

Сравнение двух диапазонов значений на перекрытие

Приветствую всех!

Недавно столкнулся с интересной практической задачей и быстро понял, в ее основе должно быть какое-то очень простое решение.

Практическая задача: при создании записи (бронирование какого-то объекта на определенное время) тригер должен проверять два поля данной записи - начало бронирование и его конец - с такими же полями всех других записей бронирование данного объекта. Согласитесь - достаточно типовая практическая задача.

Как я понимаю все можно просто свести к сравнению двух диапазонов значение и не допускать их частичного или полного перекрытия.

Что есть поля (переменные) со временем начала и конца бронирования? если привести его к типу ДатаВремя - это будет просто огромное число миллисекунд. Таким образом в упрошенном виде можно написать, что мы пытаемся забронировать время диапазона с 1000 до 1010 и теперь нужно в цикле сравнить другие диапазоны на перекрытие (например уже существующая запись имеет диапазон 1005 - 1200, т.е. получается недопустимое перекрытие времени бронирования). Я чувствую, что это задача решается просто, очень просто, но я не могу додуматься как.

У вас есть идеи? Спасибо

И вот получил ответ на киберфоруме:

(t.Start > Start && t.Start < End) || (t.End < End && t.End > Start) || (t.Start<Start && t.End>End);

похоже то что надо

Приветствую всех! 

Недавно столкнулся с интересной практической задачей и быстро понял, в ее основе должно быть какое-то очень простое решение.

Практическая задача: при создании записи (бронирование какого-то объекта на определенное время) тригер должен проверять  два поля данной записи - начало бронирование и его конец - с такими же полями всех других записей бронирование данного объекта. Согласитесь - достаточно типовая практическая задача.

Как я понимаю все можно просто свести  к сравнению двух диапазонов значение и не допускать их частичного или полного перекрытия. 

Что есть поля (переменные) со временем начала и конца бронирования? если привести его к типу ДатаВремя - это будет просто огромное число миллисекунд. Таким образом в упрошенном виде можно написать, что мы пытаемся забронировать время диапазона с 1000 до 1010 и теперь нужно в цикле сравнить другие диапазоны на перекрытие (например уже существующая запись имеет диапазон 1005 - 1200, т.е. получается недопустимое перекрытие времени бронирования). Я чувствую, что это задача решается просто, очень просто, но я не могу додуматься как. 

У вас есть идеи? Спасибо

И вот получил ответ на киберфоруме:

(t.Start > Start && t.Start < End) || (t.End < End && t.End > Start) || (t.Start<Start && t.End>End);

похоже то что надо

Я тут тоже голову поломал и вот что накидал:

Имеем диапазон S <-----------------> E

List<Бронь> Брони = [SELECT Бронь.Id FROM Бронь WHERE 
(Бронь.Start < S && S < Бронь.End) ||
(Бронь.Start < E && E < Бронь.End) ||
(S <= Бронь.Start && Бронь.End <= E)
];

Первые две проверки - это частичное перекрытие
Третья проверка - полное перекрытие + точное совпадение по диапазонам.

В принципе тоже самое что и ты написал в ответе из форума, но немного другими словами.

Я тут тоже голову поломал и вот что накидал:

Имеем диапазон S <-----------------> E

[code]List<Бронь> Брони = [SELECT Бронь.Id FROM Бронь WHERE 
    (Бронь.Start < S && S < Бронь.End) ||
    (Бронь.Start < E && E < Бронь.End) ||
    (S <= Бронь.Start && Бронь.End <= E) 
];[/code]

Первые две проверки - это частичное перекрытие
Третья проверка - полное перекрытие + точное совпадение по диапазонам.

В принципе тоже самое что и ты написал в ответе из форума, но немного другими словами.