Olá Airton Barros, tudo bem?
Seja bem vindo(a) a Comunidade Microsoft!
Para calcular as horas noturnas de um turno que pode passar da meia-noite no/com o SQL Server, é preciso lidar com a transição entre dias. A abordagem correta é considerar que um turno que começa à noite e termina na madrugada precisa ser tratado em duas partes: Uma antes da meia-noite e outra depois da meia-noite.
Para isso, você pode usar a função CASE juntamente com DATEDIFF e DATEADD para calcular corretamente as horas noturnas. Abaixo está uma solução que trata as duas partes do turno separadamente e calcula as horas noturnas totais:
Parte 1: Variáveis de Exemplo P/ Horário de Início e Final da Jornada de Trabalho.
DECLARE @Hr_Const_Ini TIME = '21:00';
DECLARE @Hr_Const_Fim TIME = '05:00';
Parte 2: Atualização das Tabelas Nas Horas a Noite/Noturnas.
UPDATE Tab_HrsNoturna
SET HORAS_CONVERTIDAS =
CASE
-- Se a hora de entrada for antes do horário final da madrugada
WHEN HR\_ENT\_NOITE < @Hr\_Const\_Fim THEN
-- Calcula o tempo entre a hora de entrada e o fim do adicional noturno
ISNULL(DATEDIFF(MINUTE, HR\_ENT\_NOITE, @Hr\_Const\_Fim), 0) / 60.0
-- Se a hora de entrada for depois do início do adicional noturno e a saída for antes do fim da madrugada
WHEN HR\_ENT\_NOITE >= @Hr\_Const\_Ini AND HR\_SAIDA\_NOITE <= @Hr\_Const\_Fim THEN
-- Calcula o tempo entre a hora de entrada e a hora de saída
ISNULL(DATEDIFF(MINUTE, HR\_ENT\_NOITE, HR\_SAIDA\_NOITE), 0) / 60.0
-- Se a hora de saída for depois do horário final da madrugada
WHEN HR\_SAIDA\_NOITE > @Hr\_Const\_Fim THEN
-- Calcula o tempo entre o início do adicional noturno e a hora de saída
ISNULL(DATEDIFF(MINUTE, @Hr\_Const\_Ini, HR\_SAIDA\_NOITE), 0) / 60.0
-- Se a hora de entrada for antes do início do adicional noturno e a saída for depois do início do adicional noturno
WHEN HR\_ENT\_NOITE < @Hr\_Const\_Ini AND HR\_SAIDA\_NOITE > @Hr\_Const\_Ini THEN
-- Calcula o tempo entre o início do adicional noturno e o fim do adicional noturno
ISNULL(DATEDIFF(MINUTE, @Hr\_Const\_Ini, @Hr\_Const\_Fim), 0) / 60.0
-- Caso padrão
ELSE
0
END
Observação 1: Essa abordagem considera as diferentes possibilidades de horários de entrada e saída para calcular corretamente as horas noturnas.
Agora, para entender melhor a consistências, deixo abaixo...
- **Primeiro
WHEN**: Se a hora de entrada for antes do fim do adicional noturno (05:00), calcula a diferença de minutos entre a entrada e o fim do adicional noturno. - **Segundo
WHEN**: Se a hora de entrada for após o início do adicional noturno (21:00) e a saída for antes do fim do adicional noturno (05:00), calcula a diferença de minutos entre a entrada e a saída. - **Terceiro
WHEN**: Se a hora de saída for após o fim do adicional noturno (05:00), calcula a diferença de minutos entre o início do adicional noturno e a saída. - **Quarto
WHEN**: Se a hora de entrada for antes do início do adicional noturno (21:00) e a saída for após o início do adicional noturno (21:00), calcula a diferença de minutos entre o início do adicional noturno e o fim do adicional noturno (05:00). - **ELSE**: Caso nenhuma das condições acima sejam atendidas, define o valor como zero.
Observação 2: Essa lógica cobre as situações comuns para calcular o adicional noturno, levando em conta os cruzamentos de dias. Adaptar esse script conforme a lógica específica e dados da sua tabela pode ser necessário.
Espero de alguma forma, ter ajudado o amigo, ok? Um forte abraço!
Se a resposta te auxiliou, não deixe por favor de "Marcar Como Resposta", por que a mesma poderá ajudar outros amigos com a mesma dúvida ou dúvidas semelhantes, obrigado!