Имя: Пароль:
1C
 
Объединение интервалов дат в запросе
0 Amfiaray
 
11.01.16
17:31
Добрый день.
Есть записи регистра типа:
Оборудование   | Дата установки | Дата снятия
Оборудование 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 salvator
 
11.01.16
17:32
По какому принципу конечный результат получается?
2 Futarkh
 
11.01.16
17:35
(1) Если периоды пересекаются, то их надо объединить
3 Futarkh
 
11.01.16
17:38
(0) Думать в сторону Левого Соединения с условием
ДатаСнятия2 > ДатаУстановки1 и ДатаСнятия2 < ДатаУстановки1
4 Futarkh
 
11.01.16
17:39
(0) Думать в сторону Левого Соединения с условием
ДатаСнятия2 > ДатаУстановки1 и ДатаСнятия2 < ДатаСнятия1
5 Futarkh
 
11.01.16
17:39
+(4) и потом группировать
6 Futarkh
 
11.01.16
17:41
+(4) Левое соединение регистра самого к себе
7 itlikbez
 
11.01.16
17:54
(0) Можно и запросом. Запросом вообще все можно. Но лучше обрабатывать в выборке. Для этой задачи императивный подход лучше декларативного.
8 itlikbez
 
11.01.16
18:06
1. Левое соединение по условию
(ДатаУстановки2 >= ДатаУстановки1 И ДатаУстановки2 <= ДатаСнятия1)
ИЛИ
(ДатаУстановки1 >= ДатаУстановки2 И ДатаУстановки1 <= ДатаСнятия2)
2. Заменить NULL на даты-корреспонденты (ЕСТЬNULL()).
3. Выбрать (ВЫБОР... КОГДА) MIN для дат установки, и MAX для дат снятия.
4. Сгруппировать.
9 itlikbez
 
11.01.16
18:07
(8) п.1 надо проверить, написал навскидку, будет работать для твоего примера.
10 Ildarovich
 
11.01.16
18:37
Вот в этой статье http://catalog.mista.ru/public/306536/ есть пример 14 "Сжатое представление последовательности дат запросом", где показано, как отдельные даты объединить в интервал. Получается, что нужно "развернуть" все интервалы в набор дат интервала, затем сгруппировать (чтобы убрать "перекрытия"), а затем объединить запросом из примера 14.

Развернуть интервалы можно соединением с производствеенным календарем, например, или с искусственной таблицей, построенной, например, как в статье http://catalog.mista.ru/public/90367/ .

В обсуждении Непрерывные интервалы в запросе с нюансом в комментарии /8/ приведено решение для объединения интервалов, но оно работает только для не пересекающихся интервалов.

А вообще задача не простая. Решение (8) может не работать для случая, когда пересекаются (стыкуются) больше двух интервалов.

Для себя добавлю, что для максимальной скорости решения этой задачи (без тэта-соединений), нужно выбрать множество дней, не входящих не в какие интервалы, а затем  способом из http://catalog.mista.ru/public/402534/ найти интервалы между пропусками. Тогда будет предельно быстро.