gifts2017

Добавление к датам рабочих дней в запросе

Опубликовал Soul Power (SoulPower) в раздел Программирование - Практика программирования

Нужно было написать запрос, добавляющий к датам рабочие дни.
Не нашёл оптимального решения, делюсь своим.

Задача

Дана таблица "Исходные даты" с колонками:

"Дата отсчета";

"Прибавить рабочих дней".

Нужно получить таблицу "Результат" с колонками:

"Дата отсчета";

"Прибавить рабочих дней";

"Дата добавлены рабочие дни".

 

Запрос

ВЫБРАТЬ
ИсходныеДаты.ДатаОтсчета КАК ДатаОтсчета,
ИсходныеДаты.ПрибавитьРабочихДней + 1 КАК ПрибавитьРабочихДней
ПОМЕСТИТЬ ИсходныеДаты
ИЗ
&ИсходныеДаты КАК ИсходныеДаты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
ИсходныеДаты.ДатаОтсчета,
ИсходныеДаты.ПрибавитьРабочихДней,
ДанныеПроизводственногоКалендаря.Дата КАК РабочийДень
ПОМЕСТИТЬ СоединениеСРабочими
ИЗ
РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИсходныеДаты КАК ИсходныеДаты
ПО (ИсходныеДаты.ДатаОтсчета <= ДанныеПроизводственногоКалендаря.Дата)
И (ДОБАВИТЬКДАТЕ(ИсходныеДаты.ДатаОтсчета, ДЕНЬ, ИсходныеДаты.ПрибавитьРабочихДней * 2 + 10) > ДанныеПроизводственногоКалендаря.Дата)
ГДЕ
ДанныеПроизводственногоКалендаря.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий))
И ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь = &КалендарьРФ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СоединениеСРабочими.ДатаОтсчета,
СоединениеСРабочими.ПрибавитьРабочихДней - 1 КАК ПрибавитьРабочихДней,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СоединениеСРабочими.РабочийДень) КАК КоличествоРабочихДней,
СоединениеСРабочими1.РабочийДень КАК ДатаДобавленыРабочиеДни
ИЗ
СоединениеСРабочими КАК СоединениеСРабочими
ВНУТРЕННЕЕ СОЕДИНЕНИЕ СоединениеСРабочими КАК СоединениеСРабочими1
ПО СоединениеСРабочими.РабочийДень <= СоединениеСРабочими1.РабочийДень
СГРУППИРОВАТЬ ПО
СоединениеСРабочими.ПрибавитьРабочихДней,
СоединениеСРабочими.ДатаОтсчета,
СоединениеСРабочими1.РабочийДень
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СоединениеСРабочими.РабочийДень) = СоединениеСРабочими.ПрибавитьРабочихДней

 

Нужно пояснить применение конструкции:

"ДОБАВИТЬКДАТЕ(ИсходныеДаты.ДатаОтсчета, ДЕНЬ, ИсходныеДаты.ПрибавитьРабочихДней * 2 + 10)"

Назовём её "Глубина поиска".

Это конец периода, в котором мы ищем дату "Дата добавлены рабочие дни".

Поясню на примере:

"Дата отсчета" = 01.07.2015.

"Прибавить рабочих дней" = 5.

Искомая дата ("Дата добавлены рабочие дни") = 08.07.2015;

Глубина поиска в таком случае равна 21.07.2015.

Тоесть мы ищем дату 08.07.2015 и интервале между 01.07.2015 и 21.07.2015. И находим.

Теперь почему +10 и умножаем на 2 ?

Потому что максимальное количество выходных подряд в году равно примерно 10 и соотношение рабочих и выходных дней примерно 2 к 1.

Таким образом должно работать для всех случаев.


П.С.

Есть аналогичная публикация:

http://infostart.ru/public/166349/

 

Отличие моей:

1) Сделано для БП 3.0;

2) Сделано для нескольких дат (задаётся в таблице, а не параметром);

3) Значительно более эффективный запрос.


Скачать файлы

Наименование Файл Версия Размер
Демо обработка 5
.epf 7,35Kb
31.07.15
5
.epf 7,35Kb Скачать

См. также

Подписаться Добавить вознаграждение
В этой теме еще нет сообщений.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа