Добавить к дате рабочие дни (Запрос)
21.06.18
Возникла задача добавить рабочие дни к дате в запросе. Нашел кучу различных вариантов. Все варианты оказались требовательны к ресурсам. Предлагаю вашему вниманию очень простое решение. Основная идея в том, чтобы рассчитывать индекс даты к которой необходимо добавить рабочие дни, и, выполняя разницу между индексом предполагаемой рабочей даты и индексом текущей даты, искать количество дней, которое мы изначально хотели добавить.
Но есть один нюанс: прибавить рабочие дни можно только к рабочим дням. Ну это не проблема, доработать очень просто. Для моей задачи такого решения было достаточно.
ВЫБРАТЬ
&ДатаККоторойНужноДобавитьДни КАК Дата,
&КоличествоДней КАК КоличествоДней
ПОМЕСТИТЬ втДаты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДанныеКалендаря.Дата
ПОМЕСТИТЬ втДанныеКалендаря
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеКалендаря
ГДЕ
ДанныеКалендаря.ПроизводственныйКалендарь.Код = "РФ"
И (ДанныеКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
ИЛИ ДанныеКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
И ДанныеКалендаря.Дата >= &ДатаДляКалендаря
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДанныеКалендаря1.Дата,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеКалендаря2.Дата) КАК Индекс
ПОМЕСТИТЬ втДанныеКалендаряСИндексами
ИЗ
втДанныеКалендаря КАК ДанныеКалендаря1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДанныеКалендаря КАК ДанныеКалендаря2
ПО ДанныеКалендаря1.Дата >= ДанныеКалендаря2.Дата
СГРУППИРОВАТЬ ПО
ДанныеКалендаря1.Дата
ИНДЕКСИРОВАТЬ ПО
Индекс
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ.Дата,
ВТ.КоличествоДней,
ДанныеКалендаря.Индекс КАК Индекс
ПОМЕСТИТЬ втДатыСИндексами
ИЗ
втДаты КАК ВТ
ЛЕВОЕ СОЕДИНЕНИЕ втДанныеКалендаряСИндексами КАК ДанныеКалендаря
ПО ВТ.Дата = ДанныеКалендаря.Дата
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Даты.Дата,
ДанныеКалендаря.Дата КАК ДатаПослеДобавленияДней
ИЗ
втДатыСИндексами КАК Даты
ЛЕВОЕ СОЕДИНЕНИЕ втДанныеКалендаряСИндексами КАК ДанныеКалендаря
ПО (ДанныеКалендаря.Индекс - Даты.Индекс = Даты.КоличествоДней)
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.