Infelizmente não conheço nenhuma fórmula do Excel que faça exatamente isso ou uma simples intersecção de intervalos de tempo, então temos que fazer uma fórmula ligeiramente extensa mesmo.
No final da resposta eu vou dar a fórmula completa, mas só para que você entenda o raciocínio, vou explicar em detalhes como pensei:
Seja o turno diário o intervalo [a,b] em horas e a duração do apontamento o intervalo [x,y]. A ideia é contar, separadamente, as horas trabalhadas no primeiro dia, nos dias completos e no último dia, para cada turno.
Podemos enxergar três casos, em que o início do apontamento começa antes de um turno, no meio ou após.
x --- | ----- | --- y | Total de horas | |||||
Caso I | a --- | ----- | ----- | ----- | ----- | ---> | y - x | a < x < y |
Caso II | a --- | ----- | ----- | ---> | y - a | x < a < y | ||
Caso III | a --- | ---> | y - y = 0 | x < y < a | ||||
y - med(a,x,y) |
Vemos que é sempre y menos o valor do meio entre a,x e y.
Esses dias são completos, desde 0h até 24h, então sendo N o número de dias completos, as horas trabalhadas serão N*(y-x).
Podemos enxergar também três casos, em que o fim do apontamento termina antes de um turno, no meio ou após.
x --- | ----- | --- y | Total de horas | |||||
Caso I | ----- | --- b | x - x = 0 | b < x < y | ||||
Caso II | ----- | ----- | ----- | --- b | b - x | x < b < y | ||
Caso III | ----- | ----- | ----- | ----- | ----- | --- b | y - x | x < y < b |
med(b,x,y) - x |
Vemos que é sempre o valor do meio entre b,x e y menos o x.
No fim teremos algo assim:
y - med(a,x,y) + N*(y-x) + med(b,x,y) - x
Agora basta somar essas três parcelas e substituir os valors de x, y, a e b para os valores reais.
Para representar um valor em horas, minutos e segundos, usaremos a função TEMPO([horas]; [minutos]; [segundos]) (TIME em inglês). Portanto, usando o turno B como exemplo:
x | TEMPO(15;0;0) |
|
y | TEMPO(22;52;0) |
Para obter o tempo da data de começo e fim, usaremos as funções HORA, MINUTO, SEGUNDO (HOUR, MINUTE, SECOND em inglês) para preencher os argumentos da função TEMPO. Estando a data de começo e fim de um apontamento nas células A2 e B2 respectivamente:
a | TEMPO(HORA(A2); MINUTO(A2); SEGUNDO(A2)) |
|
b | TEMPO(HORA(B2); MINUTO(B2); SEGUNDO(B2)) |
Para a mediana temos a função MED (MEDIAN em inglês).
E finalmente para o cálculo de dias completos, usamos a função DIAS([começo], [fim]) (DAYS em inglês), mas como ele conta o último dia, vamos subtrair de 1.
Para o turno A, por exemplo teremos:
A | B | C | |
1 | COMEÇO | FIM | Horas trabalhadas (turno A) |
2 | 10/11/2019 5:00:00 | 15/10/2019 12:30:00 |
|
Caso o apontamento tenha começado e terminado no mesmo dia, a função continuará válida pois o tempo a mais contado no primeiro e último dias serão descontados no valor negativo que resultará na conta dos dias intermediários. Essa fórmula também funciona para o turno B.
Já para o turno C temos uma pequena complicação na qual o turno é dividido no dia (de manhã até as 6h e à partir das 22h52 à noite). Nesse caso não temos opção senão considerar como dois turnos diferentes (um começando às 0h00 até 6h e outro das 22h52 ate 24h00) e somá-los. Como TEMPO(24;0;0) é considerado como 0:00:00, tive que mudar a função de mediana para a função de MAX. Aproveitei também para trocar a outra mediana pela função MIN apenas para retirar o valor TEMPO(0;0;0) da fórmula que já era grande.
No final temos, para os três turnos:
A | B | C | |
1 | COMEÇO | FIM | Turno A |
2 | 10/11/2019 5:00:00 | 15/10/2019 12:30:00 |
|
3 | COMEÇO | FIM | Turno B |
4 | 10/11/2019 5:00:00 | 15/10/2019 12:30:00 |
|
5 | COMEÇO | FIM | Turno C |
6 | 10/11/2019 5:00:00 | 15/10/2019 12:30:00 |
|
Aí seria só você mudar as referências para as células certas na sua tabela.
(Se você souber programar em VBA eu recomendaria criar uma função para isso, já que na fórmula que criei tem muitas repetições e ficou relativamente longa, mas ainda é válida.)
Espero ter ajudado.