Инвертирование периодов в запросе

FastCode 1521 12 22 67

"Вывернуть" периоды в запросе. Есть запрос с выборкой периодов исключения: ДатаНачалаИсключения - ДатаОкончанияИсключения, а также основной период ДатаНачалаОсновная - ДатаОкончанияОсновная. Нужно составить запрос так, чтобы образовались периоды на основании основного периода, в которые не входят периоды исключения. Здесь используется тот факт, что при сквозной нумерации упорядоченных краев интервалов, края одного и того же интервала будут иметь номера, одинаковые при делении на два нацело.

Автор: ildarovich

ВЫБРАТЬ
    &ДатаНачалаОсновная КАК Дата
ПОМЕСТИТЬ Даты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(Дано.ДатаНачалаИсключения, ДЕНЬ, -1)
ИЗ
    Дано КАК Дано
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(Дано.ДатаОкончанияИсключения, ДЕНЬ, 1)
ИЗ
    Дано КАК Дано
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    &ДатаОкончанияОсновная
;
ВЫБРАТЬ
    МИНИМУМ(Даты.Дата) КАК ДатаНачала,
    МАКСИМУМ(Даты.Дата) КАК ДатаОкончания
ИЗ
    (ВЫБРАТЬ
        КОЛИЧЕСТВО(Раньше.Дата) КАК Номер,
        Даты.Дата КАК Дата
    ИЗ
        Даты КАК Раньше
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Даты КАК Даты
            ПО Раньше.Дата <= Даты.Дата
    СГРУППИРОВАТЬ ПО
        Даты.Дата) КАК Даты
СГРУППИРОВАТЬ ПО
    ВЫРАЗИТЬ(Даты.Номер / 2 КАК ЧИСЛО(10, 0))
0
{} Ожидается идентификатор

См. также

Нахождение интервалов в запросе

Получить даты за период в запросе

ПодключитьТестовыйПериод (БСП)

ПодключениеТестовыхПериодов_ПроверитьСостояниеЗапроса (БСП)

ПроверитьСостояниеЗапроса (БСП)

Разбиение произвольного периода на интервалы в запросе

Средневзвешенный курс валюты за указанный период

Срез на даты за период. Шаблон запроса

ПроверитьСостояниеЗапросаНаПодключение (БСП)

Модератору