Имя: Пароль:
1C
 
Объединение интервалов дат в запросе
0 егаис
 
05.01.24
12:06
Есть таблица вида Сотрудник / ДатаНачала / ДатаОкончания, данные из табеля

Иванов / 01.12.23 / 01.12.23
Иванов / 02.12.23 / 02.12.23
Иванов / 05.12.23 / 05.12.23
Иванов / 06.12.23 / 06.12.23

Как запросом получить?
Иванов / 01.12.23 / 02.12.23
Иванов / 05.12.23 / 06.12.23

пробовал по методу Ильдаровича, но там походу нужны смежные периоды.
Такой код отработал "криво". Часть периодов свернул, часть - нет
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ТаблицаПериодов.Сотрудник КАК Сотрудник,
        |    ТаблицаПериодов.Период КАК НачалоПериода,
        |    ТаблицаПериодов.Период, ДЕНЬ КАК КонецПериода
        |ПОМЕСТИТЬ Дано
        |ИЗ
        |    &ТаблицаПериодов КАК ТаблицаПериодов
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    Дано.НачалоПериода,
        |    Дано.КонецПериода,
        |    Дано.Сотрудник,
        |    СУММА(РАЗНОСТЬДАТ(Слева.НачалоПериода, Слева.КонецПериода, ДЕНЬ) + 1) КАК Интеграл
        |ПОМЕСТИТЬ ДаноПлюс
        |ИЗ
        |    Дано КАК Дано
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Дано КАК Слева
        |        ПО (Слева.НачалоПериода <= Дано.НачалоПериода)
        |
        |СГРУППИРОВАТЬ ПО
        |    Дано.НачалоПериода,
        |    Дано.КонецПериода,
        |    Дано.Сотрудник
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    МИНИМУМ(Дано.НачалоПериода) КАК НачалоПериода,
        |    МАКСИМУМ(Дано.КонецПериода) КАК КонецПериода,
        |    Дано.Сотрудник
        |ИЗ
        |    ДаноПлюс КАК Дано
        |
        |СГРУППИРОВАТЬ ПО
        |    ДОБАВИТЬКДАТЕ(Дано.КонецПериода, ДЕНЬ, -Дано.Интеграл),
        |    Дано.Сотрудник";
1 егаис
 
05.01.24
12:16
есть такие данные

Иванов / 09.12.23 / 09.12.23
Иванов / 10.12.23 / 10.12.23
Иванов / 11.12.23 / 11.12.23
Иванов / 12.12.23 / 12.12.23

в итоге запрос свернул так
Иванов / 09.12.23 / 09.12.23
Иванов / 10.12.23 / 12.12.23

почему-то 09 и 10 числа не объединил.
2 егаис
 
05.01.24
12:20
нашел ошибку. Решение работает, если сотрудник один в таблице. Если несколько , то надо добавить в соединение и сотрудника
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Дано КАК Слева
        |        ПО (Слева.НачалоПериода <= Дано.НачалоПериода)
        |        И (Слева.Сотрудник = Дано.Сотрудник)


закрывем тему
3 SleepyHead
 
05.01.24
18:48
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой