Приветствую всех!
Недавно столкнулся с интересной практической задачей и быстро понял, в ее основе должно быть какое-то очень простое решение.
Практическая задача: при создании записи (бронирование какого-то объекта на определенное время) тригер должен проверять два поля данной записи - начало бронирование и его конец - с такими же полями всех других записей бронирование данного объекта. Согласитесь - достаточно типовая практическая задача.
Как я понимаю все можно просто свести к сравнению двух диапазонов значение и не допускать их частичного или полного перекрытия.
Что есть поля (переменные) со временем начала и конца бронирования? если привести его к типу ДатаВремя - это будет просто огромное число миллисекунд. Таким образом в упрошенном виде можно написать, что мы пытаемся забронировать время диапазона с 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] Первые две проверки - это частичное перекрытие Третья проверка - полное перекрытие + точное совпадение по диапазонам. В принципе тоже самое что и ты написал в ответе из форума, но немного другими словами.