"Вывернуть" периоды в запросе

1. Release 12.12.17 12:14 Сейчас в теме
Есть запрос с выборкой периодов исключения: ДатаНачалаИсключения - ДатаОкончанияИсключения, а также основной период ДатаНачалаОсновная - ДатаОкончанияОсновная.
Нужно составить запрос так, чтобы образовались периоды на основании основного периода, в которые не входят периоды исключения.

Т.е., например:
ДатаНачалаОсновная - ДатаОкончанияОсновная
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
Показать

Поделитесь решением, кому не жалко.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Fe9_min 50 12.12.17 12:23 Сейчас в теме
|ВЫБРАТЬ
|	ЗаказКлиента.Ссылка
|ИЗ
|	Документ.ЗаказКлиента КАК ЗаказКлиента
|ГДЕ
|	ЗаказКлиента.Дата МЕЖДУ &ДатаН1 И &ДатаОк1
|	И НЕ(ЗаказКлиента.Дата МЕЖДУ &ДатаН2 И &ДатаОк2)
|	И НЕ(ЗаказКлиента.Дата МЕЖДУ &ДатаН3 И &ДатаОк3)


Я же правильно понял ваш вопрос?
3. Release 12.12.17 12:27 Сейчас в теме
(2) Нет, я же пример привел.
Мне, нужно получить именно периоды, а не ссылки или что-то еще в этих периодах.
4. Fe9_min 50 12.12.17 12:33 Сейчас в теме
(3)кол-во периодов исключения статично? или может быть больше и меньше? сейчас 3 шт.
5. Release 12.12.17 12:34 Сейчас в теме
(4) Количество периодов может быть любое и разное для каждого объекта.
6. ildarovich 7865 12.12.17 13:46 Сейчас в теме
Вот один из вариантов:
ВЫБРАТЬ
	&ДатаНачалаОсновная КАК Дата
ПОМЕСТИТЬ Даты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(Дано.ДатаНачалаИсключения, ДЕНЬ, -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))
Показать
v_den_v; M.Flint; Aitbay; Onwardv; +4 Ответить
9. Release 12.12.17 14:54 Сейчас в теме
(6) Спасибо, посмотрю.

(7) Тоже, спасибо. Периоды исключения и не должны пересекаться. Если пересекаются, это ошибка.

(8) Да, так это отчет на СКД. И не хочется, обрабатывать промежуточный результат кодом.
10. Onwardv 64 12.12.17 15:09 Сейчас в теме
(6)Вот же ж. Как всегда. Я в восторге. Но вот ход мысли не для средних умов :).
7. antz 12.12.17 14:11 Сейчас в теме
Ну или так.

Правда, не учитывается вариант, когда периоды исключения перекрываются.
Прикрепленные файлы:
Периоды.epf
8. Aitbay 12.12.17 14:49 Сейчас в теме
обязательно это делать в запросе?
11. Aitbay 13.12.17 07:20 Сейчас в теме
хорошее решение надо гденить сохранить в ЗУПе часто необходимо с периодами играться
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот