Объединение интервалов дат в запросе #762402


#0 by Amfiaray
Добрый день. Есть записи регистра типа: Оборудование   | Дата установки | Дата снятия Оборудование 1 | 01.10.2015     | 10.10.2015 Оборудование 1 | 20.10.2015     | 31.10.2015 Оборудование 1 | 15.10.2015     | 25.10.2015 В итоге должно получиться: Оборудование 1 | 01.10.2015     | 10.10.2015 Оборудование 1 | 15.10.2015     | 31.10.2015 Возможно такое сделать запросом или придется выборку обходить в коде?
#1 by salvator
По какому принципу конечный результат получается?
#2 by Futarkh
Если периоды пересекаются, то их надо объединить
#3 by Futarkh
Думать в сторону Левого Соединения с условием ДатаСнятия2 > ДатаУстановки1 и ДатаСнятия2 < ДатаУстановки1
#4 by Futarkh
Думать в сторону Левого Соединения с условием ДатаСнятия2 > ДатаУстановки1 и ДатаСнятия2 < ДатаСнятия1
#5 by Futarkh
+ и потом группировать
#6 by Futarkh
+ Левое соединение регистра самого к себе
#7 by itlikbez
Можно и запросом. Запросом вообще все можно. Но лучше обрабатывать в выборке. Для этой задачи императивный подход лучше декларативного.
#8 by itlikbez
1. Левое соединение по условию (ДатаУстановки2 >= ДатаУстановки1 И ДатаУстановки2 <= ДатаСнятия1) ИЛИ (ДатаУстановки1 >= ДатаУстановки2 И ДатаУстановки1 <= ДатаСнятия2) 2. Заменить NULL на даты-корреспонденты (ЕСТЬNULL). 3. Выбрать (ВЫБОР... КОГДА) MIN для дат установки, и MAX для дат снятия. 4. Сгруппировать.
#9 by itlikbez
п.1 надо проверить, написал навскидку, будет работать для твоего примера.
#10 by Ildarovich
Вот в этой статье есть пример 14 "Сжатое представление последовательности дат запросом", где показано, как отдельные даты объединить в интервал. Получается, что нужно "развернуть" все интервалы в набор дат интервала, затем сгруппировать (чтобы убрать "перекрытия"), а затем объединить запросом из примера 14. Развернуть интервалы можно соединением с производствеенным календарем, например, или с искусственной таблицей, построенной, например, как в статье . В обсуждении в комментарии /8/ приведено решение для объединения интервалов, но оно работает только для не пересекающихся интервалов. А вообще задача не простая. Решение может не работать для случая, когда пересекаются (стыкуются) больше двух интервалов. Для себя добавлю, что для максимальной скорости решения этой задачи (без тэта-соединений), нужно выбрать множество дней, не входящих не в какие интервалы, а затем  способом из найти интервалы между пропусками. Тогда будет предельно быстро.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С