Посчитать кол-во рабочих часов

  • Автор темы Snickbw
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

Snickbw

Кто нибудь сталкивался с такой проблемой?

Задан рабочий день: 08:00-17:00 ежедневно
Устройство принято в ремонт : 14:30 date1
Устройство выдано из ремонта : 09:45 date5

Вопрос: как посчитать количество РАБОЧИХ часов:минут которые устройство находилось в ремонте?

Задача тривиальная и довольно распространенная, но у меня получился код листа на два. При этом если еще ввести выходные, обеденный перерыв, то код еще увеличивается в разы.
Я через цикл сделал, вот только если период большой, а шаг делать например в 5 минут, то цикл на месяц содержит около 10000 оборотов, кроме того внутри цикла вычисление дня недели для каждых 5 минут, выборка рабочего периода этого дня недели, сравнение на попадание текущего времени в рабочий период. В общем подвисает прилично машина.
Возможно есть более оригинальное решение.
 
B

Barmutik

Утверждать конечно не буду что вариант архиверный .. но так вот сходу если без учёта обеда и выходных(которые не сложно добавить) то будет что-то аля так:

Код:
 ATimeInWork := IncMinute(0, MinutesBetween(AFinishDate, AStartDate) -
Max(0, Trunc(AFinishDate) - Trunc(AStartDate) - 1) * 15 * 60 -
IfThen(Trunc(AFinishDate) <> Trunc(AStartDate), MinutesBetween(StrToTime('17' + TimeSeparator +
'00' + TimeSeparator + '00'), 1) + MinutesBetween(0, StrToTime('8' + TimeSeparator + '00' + TimeSeparator + '00')), 0));

Сделаны допущения что в AFinishDate - время выдачи из ремонта, AStartDat - время сдачи в ремонт - БЕЗ СЕКУНД И МИЛЛИСЕКУНД - иначе возможна погрешность в 1 минуту .. лень разбираться где она.
Время работы с 8 до 17.00...

В ATimeInWork - время сколько конкретно прошло рабочего времени между сдачей и получением..
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!