Есть запрос с выборкой периодов исключения: ДатаНачалаИсключения - ДатаОкончанияИсключения, а также основной период ДатаНачалаОсновная - ДатаОкончанияОсновная.
Нужно составить запрос так, чтобы образовались периоды на основании основного периода, в которые не входят периоды исключения.
Т.е., например:
Поделитесь решением, кому не жалко.
Нужно составить запрос так, чтобы образовались периоды на основании основного периода, в которые не входят периоды исключения.
Т.е., например:
ДатаНачалаОсновная - ДатаОкончанияОсновная
01.01.2017 - 31.12.2017
ДатаНачалаИсключения - ДатаОкончанияИсключения
13.03.2017 - 18.03.2017
21.05.2017 - 08.07.2017
03.09.2017 - 12.11.2017
Результат:
01.01.2017 - 12.03.2017
19.03.2017 - 20.05.2017
09.07.2017 - 02.09.2017
13.11.2017 - 31.12.2017
Показать01.01.2017 - 31.12.2017
ДатаНачалаИсключения - ДатаОкончанияИсключения
13.03.2017 - 18.03.2017
21.05.2017 - 08.07.2017
03.09.2017 - 12.11.2017
Результат:
01.01.2017 - 12.03.2017
19.03.2017 - 20.05.2017
09.07.2017 - 02.09.2017
13.11.2017 - 31.12.2017
Поделитесь решением, кому не жалко.
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
|ВЫБРАТЬ
| ЗаказКлиента.Ссылка
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказКлиента
|ГДЕ
| ЗаказКлиента.Дата МЕЖДУ &ДатаН1 И &ДатаОк1
| И НЕ(ЗаказКлиента.Дата МЕЖДУ &ДатаН2 И &ДатаОк2)
| И НЕ(ЗаказКлиента.Дата МЕЖДУ &ДатаН3 И &ДатаОк3)
Я же правильно понял ваш вопрос?
Вот один из вариантов: Чтобы проверить в консоли вариант со вводом тестовых данных:
ВЫБРАТЬ
&ДатаНачалаОсновная КАК Дата
ПОМЕСТИТЬ Даты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(Дано.ДатаНачалаИсключения, ДЕНЬ, -1)
ИЗ
Дано КАК Дано
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(Дано.ДатаОкончанияИсключения, ДЕНЬ, 1)
ИЗ
Дано КАК Дано
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
&ДатаОкончанияОсновная
;
ВЫБРАТЬ
МИНИМУМ(Даты.Дата) КАК ДатаНачала,
МАКСИМУМ(Даты.Дата) КАК ДатаОкончания
ИЗ
(ВЫБРАТЬ
КОЛИЧЕСТВО(Раньше.Дата) КАК Номер,
Даты.Дата КАК Дата
ИЗ
Даты КАК Раньше
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Даты КАК Даты
ПО Раньше.Дата <= Даты.Дата
СГРУППИРОВАТЬ ПО
Даты.Дата) КАК Даты
СГРУППИРОВАТЬ ПО
ВЫРАЗИТЬ(Даты.Номер / 2 КАК ЧИСЛО(10, 0))
ПоказатьВЫБРАТЬ
ДАТАВРЕМЯ(2017, 3, 13) КАК ДатаНачалаИсключения,
ДАТАВРЕМЯ(2017, 3, 18) КАК ДатаОкончанияИсключения
ПОМЕСТИТЬ Дано
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДАТАВРЕМЯ(2017, 5, 21),
ДАТАВРЕМЯ(2017, 7, 8)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДАТАВРЕМЯ(2017, 9, 3),
ДАТАВРЕМЯ(2017, 11, 12)
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
&ДатаНачалаОсновная КАК Дата
ПОМЕСТИТЬ Даты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(Дано.ДатаНачалаИсключения, ДЕНЬ, -1)
ИЗ
Дано КАК Дано
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(Дано.ДатаОкончанияИсключения, ДЕНЬ, 1)
ИЗ
Дано КАК Дано
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
&ДатаОкончанияОсновная
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
МИНИМУМ(Даты.Дата) КАК ДатаНачала,
МАКСИМУМ(Даты.Дата) КАК ДатаОкончания
ИЗ
(ВЫБРАТЬ
КОЛИЧЕСТВО(Раньше.Дата) КАК Номер,
Даты.Дата КАК Дата
ИЗ
Даты КАК Раньше
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Даты КАК Даты
ПО Раньше.Дата <= Даты.Дата
СГРУППИРОВАТЬ ПО
Даты.Дата) КАК Даты
СГРУППИРОВАТЬ ПО
ВЫРАЗИТЬ(Даты.Номер / 2 КАК ЧИСЛО(10, 0))
Показать
Ну или так.
Правда, не учитывается вариант, когда периоды исключения перекрываются.
Правда, не учитывается вариант, когда периоды исключения перекрываются.
Прикрепленные файлы:
Периоды.epf
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот