Александр Среда
Для решения задачи расширенного отчета мне требовалось вычислять рабочее время потраченное сотрудником на поставленную ему задачу в днях.
Попробовал использовать уже имеющиеся решения этой задачи, но столкнулся с небольшими проблемами, поэтому написал свой вариант решения.
На мой взгляд, получилось совсем не плохо :-)
Первый вариант пришлось немного изменить (для тех кто уже успел с ним ознакомиться), так как для расчета необходимо было вызывать процедуру, а не функцию, что осложняло использование решения в запросах для построения отчетов.
И так, решение теперь состоит из 4 функций:
1. Функция расчета рабочего времени в первый день заданного периода
2. Функция расчета общего рабочего времени в первый день заданного периода
3. Функция расчета рабочего времени в последний день заданного периода
4. Функция расчета рабочего времени за период
Есть несколько допущений:
1. Если дата старта не задана, то она приравнивается к началу текущего дня
2. Если дата окончания не задача, то она приравнивается к текущему моменту времени
3. Если не указан идентификатор бизнес-календаря, то выполняется поиск первого в системе.
4. Если календарей нет в системе, то календарем по умолчанию считается рабочий день с 09 до 18 с перерывом на обед с 13 до 14 пять дней в неделю
При запуске процедуры расчета рабочего времени есть параметры:
@OnlyFullDay:
1 - учитываются только полные рабочие дни, т.е. без первого рабочего дня и последнего;
0 - в дополнение к полным дням учитываются первый и последний день, если в них было рабочее время
@Mode:
1 - результат возвращается в минутах (параметр @OnlyFullDay тогда игнорируется)
0 - результат в днях
Функция возвращает количество рабочих дней или количество рабочего времени в минутах.
Рабочее время вычисляется за любой промежуток времени, в том числе, при переходе между годами.
У себя тестил на различных вариантах настроек календаря и без него - работает.
Ссылки по теме
Файлы для загрузки