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. buriZa 34 12.12.17 12:23 Сейчас в теме
|ВЫБРАТЬ
|	ЗаказКлиента.Ссылка
|ИЗ
|	Документ.ЗаказКлиента КАК ЗаказКлиента
|ГДЕ
|	ЗаказКлиента.Дата МЕЖДУ &ДатаН1 И &ДатаОк1
|	И НЕ(ЗаказКлиента.Дата МЕЖДУ &ДатаН2 И &ДатаОк2)
|	И НЕ(ЗаказКлиента.Дата МЕЖДУ &ДатаН3 И &ДатаОк3)


Я же правильно понял ваш вопрос?
3. Release 12.12.17 12:27 Сейчас в теме
(2) Нет, я же пример привел.
Мне, нужно получить именно периоды, а не ссылки или что-то еще в этих периодах.
4. buriZa 34 12.12.17 12:33 Сейчас в теме
(3)кол-во периодов исключения статично? или может быть больше и меньше? сейчас 3 шт.
5. Release 12.12.17 12:34 Сейчас в теме
(4) Количество периодов может быть любое и разное для каждого объекта.
6. ildarovich 6720 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))
Показать
M.Flint; Aitbay; Onwardv; +3 Ответить
9. Release 12.12.17 14:54 Сейчас в теме
(6) Спасибо, посмотрю.

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

(8) Да, так это отчет на СКД. И не хочется, обрабатывать промежуточный результат кодом.
10. Onwardv 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 Сейчас в теме
хорошее решение надо гденить сохранить в ЗУПе часто необходимо с периодами играться
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Бизнес-архитектор 1С, ведущий консультант
Санкт-Петербург
Полный день

Руководитель проектов 1С
Санкт-Петербург
Полный день

Программист 1C
Москва
зарплата от 100 000 руб. до 150 000 руб.
Полный день

Программист 1С
Москва
зарплата от 120 000 руб. до 150 000 руб.
Полный день

Программист 1С
Санкт-Петербург
зарплата от 80 000 руб. до 120 000 руб.
Полный день