Вычисление количества часов дня недели между двумя датами в Excel - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь определить , сколько периода между двумя моментами времени приходится на рабочий день (как определено функцией NETWORKDAYS в Excel).Например, «время рабочего дня» между вторником 11 вечера и следующей средой 2 часа ночи составляет 3 часа.То же самое с пятницы 11 вечера до понедельника 2 часа ночи.И поэтому, если время начала пятницы 20:00, а время окончания в любое время в субботу или воскресенье, ответ должен быть 4 часа - часть интервала, приходящаяся на выходные (или выходные), должнабыть проигнорированным (или вычтенным из сквозной продолжительности).

Нижняя часть этого вопроса иллюстрирует больше примеров.

Я нашел много вещей здесь, но они имеют дело с SQL, кодоми т. д., а не тонна в Excel.Я нашел это , но это не помогло мне напрямую.

Я использую это для формулы:

=NETWORKDAYS(F2,G2,Q$2:Q$7)-1-MOD(F2,1)+MOD(G2,1) 

и ниже происходит то, что происходит.

Correct and incorrect

Quick check

Что мне здесь не хватает?

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Необходимо учитывать, что даты начала и окончания интервалов могут приходиться на выходные (или праздничные дни).В этом случае условия MOD не должны применяться.Попробуйте это:

=(NETWORKDAYS(F2,G2,$Q$2:$Q$6)-IF(AND(WEEKDAY(F2,2)<6,ISNA(MATCH(INT(F2),$Q$2:$Q$6,0))),MOD(F2,1),0)+IF(AND(WEEKDAY(G2,2)<6,ISNA(MATCH(INT(G2),$Q$2:$Q$6,0))),MOD(G2,1)-1,0))

Надеюсь, это поможет.

0 голосов
/ 03 декабря 2018

Ваша формула сильно зависит от управления входными данными.В настоящее время ваша формула будет работать, только если первый и последний день в диапазоне дат является рабочим днем.Это связано с MOD(F2,1)+MOD(G2,1), который берет остатки первого и последнего дня в вашем диапазоне.Если это будет нерабочий день, тогда ваша формула будет неправильной.

Комбинируя вашу формулу с информацией, найденной в ответе здесь , вы можете заставить формулу делать то, что вы хотите, из того, что выhave.

Здесь:

=NETWORKDAYS(IF(WEEKDAY(F2)<5,F2,WORKDAY(F2,1,holidays)),IF(WEEKDAY(G2)<5,G2,WORKDAY(G2,-1,holidays)),holidays)-IF(WEEKDAY(F2,2)<6,MOD(F2,1),1)+IF(WEEKDAY(G2,2)<6,MOD(G2,1),0)

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

Как и в случае, это точно так же, как ваша первоначальная формула, но с добавленными проверками самих дат.Ссылка на "праздники" может быть заменена ссылками на ваши ячейки.Я просто использовал именованный диапазон для удобства.

Редактировать: WEEKDAY(F2)<5 может потребоваться заменить на WEEKDAY(F2,2)<6, чтобы убедиться, что вы работаете с рабочими неделями запуска понедельника.

0 голосов
/ 03 декабря 2018

Для начала вам не хватает четкого определения проблемы.Сколько часов в будние дни между полуднем пятницы и полуднем субботы?

Хорошо, я думаю, вы иллюстрируете того, что вы хотите на нижнем изображении.

Чтобы быть менее язвительным, вам не хватает (что вы выглядите , чтобы не заметить), это то, что во всех примерах вы говорите, что результат неправильный (и только вэти случаи), либо ваша дата / время начала (F<i>n</i>), либо ваша дата / время окончания (G<i>n</i>) - суббота или воскресенье.(Попробуйте использовать формат <b>ddd</b> mm-dd-yyyy h:mm:ss вместо mm-dd-yyyy h:mm:ss.) NETWORKDAYS(Wednesday,Friday) - это 3.Но NETWORKDAYS(Wednesday,Saturday) и NETWORKDAYS(Wednesday,Sunday) также 3.

Возьмите свой первый пример: Вт 07-03-2018 15:44:16 до Солнце 07-08-2018 20:09:56.NETWORKDAYS(Tuesday,Sunday) обычно равно 4 (вторник, среда, четверг и пятница; игнорируя выходные), но NETWORKDAYS(Tuesday 07-03,Sunday 07-08) равно 3 из-за выходного дня 07-04.Таким образом, ваша формула работает до 3-1- (15:44:16) + (20:09:56) или 2+ (20: 09: 56-15: 44: 16), или 2 дня и 4:25: 40, что равно 52:25:40, и это то, что Excel дает вам.Вы не приняли во внимание тот факт, что

your_formula(Tue 07-03-2018 15:44:16, Sun 07-08-2018 20:09:56)
равно
your_formula(Tue 07-03-2018 15:44:16, Fri 07-06-2018 20:09:56)
, что пропускает 3:50:04 между Пт 07- 06 -2018 20:09:56 иПт 07-06-2018 24:00:00 - и, о чудо, 3:50:04 - это количество расхождений.

Еще более ясна третья строка, где указаны дата / время началасб 07-21-2018 6: 30: 12 , и расхождение составляет 6: 30: 12.


Я нашел решение, основанное на том факте, что NETWORKDAYS(<i>some_date</i>, <i>the_<b>same</b>_date</i>, <i>(holidays)</i>)равно 1, если дата является рабочим днем, и 0, если это не так.Так что

=NETWORKDAYS(F2,G2,Q$2:Q$7)-NETWORKDAYS(G2,G2,Q$2:Q$7)-NETWORKDAYS(F2,F2,Q$2:Q$7)*MOD(F2,1)+NETWORKDAYS(G2,G2,Q$2:Q$7)*MOD(G2,1)

даст вам желаемый результат.

...