Имя: Пароль:
1C
1С v8
Свертка интервалов дат в запросе
0 eandrs
 
15.10.11
13:04
Суть проблемы такова: имеется таблица интервалов дат с двумя полями, условно - НачалоПериода, КонецПериода. Интервалы могут пересекаться, а могут и нет. Необходимо максимально возможно свернуть пересекающиеся интервалы. Вопрос.... Такое возможно сделать запросом? И если да - то как?
1 Renat11111
 
15.10.11
13:14
Запрос к таблице значений и выбрать Максимум(КонецПериода) и Минимум(НачалоПериода) или не так понял?
2 eandrs
 
15.10.11
13:18
На примере поясню. Интервалы
10.01.2011 - 13.01.2011
12.01.2011 - 18.01.2011
15.01.2011 - 22.01.2011
25.01.2011 - 27.01.2011

Желаемый результат -
10.01.2011 - 22.01.2011
25.01.2011 - 27.01.2011
3 Renat11111
 
15.10.11
13:27
(2) В принципе ничего не меняеть просто лень самому экспериментировать... Выбрать Максимум(КонецПериода) и Минимум(НачалоПериода)  + После где придумать подходящее условие.
4 eandrs
 
15.10.11
13:34
Что-то мне подсказывает, что без соединений здесь не обойтись... Причём будет оно ни разу не одно.
5 eandrs
 
15.10.11
13:55
В-общем - вопрос закрыт. Запросом это сделать можно, но с некоторым извратом.
6 kuza2000
 
15.10.11
15:28
Кстати, возможно мне предстоит делать примерно то же. Правда, время до минут и нужно узнать сумму длительностей интервалов в указанный период. Что то мне думается, что надо покопать в направлении регистров расчетов...
7 kuza2000
 
15.10.11
15:29
(5) А какое решение было найдено, если не секрет?
8 Мимохожий Однако
 
15.10.11
15:32
(5)колись, родимый.
9 eandrs
 
17.10.11
15:47
Решение-то есть. Только оно ни-разу не быстрое, ибо использует туеву хучу соединений и группировок. Нужно пять раз подумать, прежде чем его использовать. Готового кода пока нет. Могу лишь словестно описать суть. На конкретном примере.

Интервалы:
Начало       Конец
10.01.2011 - 13.01.2011
12.01.2011 - 18.01.2011
15.01.2011 - 22.01.2011
16.01.2011 - 21.01.2011
25.01.2011 - 27.01.2011
26.01.2011 - 30.01.2011

Шаг первый:
Делаем левое соединение этой таблицы с самой собой (условие - полное попадание интервала из левой таблицы в интервал правой), в качестве новых границ берем границы правой таблицы, если возможно, после чего группируем по всем полям/ выбрать различные. Получаем:

Начало       Конец
10.01.2011 - 13.01.2011
12.01.2011 - 18.01.2011
15.01.2011 - 22.01.2011
25.01.2011 - 27.01.2011
26.01.2011 - 30.01.2011

Шаг второй
Ещё одно левое соединение полученной с самой собой (строки левой таблицы соединяем с предыдущими по номеру строками правой таблицы). Вычисляем дополнительное поле ЕстьПересечение (если есть пересечений периодов Истина, если нет пересечения, или период первый - Ложь). Получаем:

Начало       Конец      ЕстьПересечение
10.01.2011 - 13.01.2011 Ложь
12.01.2011 - 18.01.2011 Истина
15.01.2011 - 22.01.2011 Истина
25.01.2011 - 27.01.2011 Ложь
26.01.2011 - 30.01.2011 Истина

Шаг третий:
Формируем промежуточную таблицу "новых границ" - отбираем из сформированной на предыдущем шаге таблице записи с ЕстьПересечение = Ложь. Получаем:

НачалоПериодаДляСреза      
10.01.2011
25.01.2011

Шаг четвертый
Ещё одно левое соединение полученной на шаге 2 с таблицей из шага 3 с последующей группировкой (для каждой записи таблицы из шага 2 - выполняем псевдосрез последних). Получаем:

Начало       Конец       НачалоПериодаДляСреза      
10.01.2011 - 13.01.2011  10.01.2011
12.01.2011 - 18.01.2011  10.01.2011
15.01.2011 - 22.01.2011  10.01.2011
25.01.2011 - 27.01.2011  25.01.2011
26.01.2011 - 30.01.2011  25.01.2011

В качестве новой даты начала берем дату из псевдосреза.
Получаем:

Начало       Конец            
10.01.2011 - 13.01.2011
10.01.2011 - 18.01.2011
10.01.2011 - 22.01.2011
25.01.2011 - 27.01.2011
25.01.2011 - 30.01.2011

Накатываем итоговую группировку по началу периода и максимум от конца периода, получаем счастье. Чувствую себя извращенцем.