Dúvidas Sobre Script p/ Uso no SQL Server

Anônima
2024-04-30T14:53:58+00:00

Título Original: SQL Server - Cálculo de Adicional Noturno.

SQL Server - Bom Dia à todos. O Adicional Noturno começa as 21:00 horas e termina as 05:00 da manhã do outro dia, pergunto: Como calcular no SQL Server já que o trabalhador pode entrar antes das 00:00 horas (22:00 exemplo) e entrar depois das 00:00 (01:00 por exemplo. Meu problema é a questão AM-PM.

Exemplo:

UPDATE Tab_HrsNoturna

SET HORAS_CONVERTIDAS = CASE    WHEN (FORMAT(HR_ENT_NOITE, 'HH:mm') > FORMAT(@Hr_Const_Ini, 'HH:mm') AND FORMAT(HR_SAIDA_NOITE, 'HH:mm') < FORMAT(@Hr_Const_Fim, 'HH:mm'))  THEN 

                       ISNULL(DATEDIFF(MINUTE, FORMAT(@Hr_Const_Ini, 'HH:mm'), DATEADD(DAY,1, FORMAT(HR_SAIDA_NOITE, 'HH:mm'))),0)/60.0  else outra coisa END

Se HR_ENT_NOITE for 22:00 o calculo sai correto, mas se a hora for 03:00, o calculo retorna errado.

observação

@Hr_Const_Ini = '21:00'

@Hr_Const_Fim = 05:00

Agradecido a qualquer ajuda.

Windows para empresas | Windows Server | Desempenho | Tecnologias e compatibilidade de aplicativos

Pergunta bloqueada. Essa pergunta foi migrada da Comunidade de Suporte da Microsoft. É possível votar se é útil, mas não é possível adicionar comentários ou respostas ou seguir a pergunta.

0 comentários Sem comentários
Resposta aceita pelo autor da pergunta
Anônima
2024-05-20T17:47:52+00:00

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 &lt; @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 &gt;= @Hr\_Const\_Ini AND HR\_SAIDA\_NOITE &lt;= @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 &gt; @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 &lt; @Hr\_Const\_Ini AND HR\_SAIDA\_NOITE &gt; @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...

  1. **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.
  2. **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.
  3. **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.
  4. **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).
  5. **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!

Esta resposta foi útil?

0 comentários Sem comentários

1 resposta adicional

Classificar por: Mais Novo
  1. Anônima
    2024-04-30T15:40:13+00:00

    Esta resposta foi traduzida automaticamente. Como resultado, pode haver erros gramaticais ou palavras estranhas.

    Olá

    Obrigado por postar no fórum da Comunidade Microsoft.

    Com base na descrição, entendo que sua pergunta está relacionada ao SQL Server.

    Uma vez que não há engenheiros dedicados ao SQL Server neste fórum. a fim de ser capaz de obter um tratamento rápido e eficaz do seu problema, eu recomendo que você repostar sua pergunta no fórum de perguntas e respostas, onde haverá um engenheiro dedicado para lhe dar uma resposta profissional e eficaz.

    Aqui está o link para o fórum de perguntas e respostas.

    Perguntas - Perguntas e respostas da Microsoft

    Clique no botão "Fazer uma pergunta" no canto superior direito para postar sua pergunta e selecione a tag "SQL Server".

    Obrigado pela compreensão e apoio. Se você tiver alguma dúvida ou preocupação, sinta-se à vontade para nos avisar.

    Tenha um bom dia.

    Atenciosamente

    Wesley Li

    Esta resposta foi útil?

    0 comentários Sem comentários