none
Calculo de horas

    Question

  •  Pessoal tenho um banco de dados de pessoal e preciso calcular as horas positvas ou negativas dos funcionários;
     
    Horario de entrada: 08:00
    Horario de almoço: 12:30
    Horario de volta do almoço: 13:30
    Horario de saída:  17:00

    Horario de trabalho:  10:00
     
    Como faço para calcular o saldo de horas de um funcionario caso ele chegue atrasado ou faça horas extras, ex: 02:00. valeu
    Tuesday, February 03, 2009 10:46 PM

Answers

  • Olá,

    Dê uma olhada no exemplo abaixo. Agora só falta, como falei acima, trabalhar com a conversão para horas e minutos e na formatação da saída. No exemplo do Marcelo, tem como separar em horas e minutos.


    DECLARE @entrada DATETIME    
    DECLARE @almoco DATETIME  
    DECLARE @voltadoalmoco DATETIME  
    DECLARE @saida DATETIME  
    DECLARE @maximoextras INT 
     
    SELECT @entrada      = '08:00' 
        , @almoco        = '12:30' 
        , @voltadoalmoco = '13:30'   
        , @saida         = '17:03' 
        , @maximoextras  = 480 --// em minutos: 8 x 60 = 480  
     
    SELECT (DATEDIFF(mi, @entrada, @almoco) + DATEDIFF(mi, @voltadoalmoco, @saida)) AS Total_Diario_Em_Minutos  
     
    ,   CASE WHEN ( (DATEDIFF(mi, @entrada, @almoco) + DATEDIFF(mi, @voltadoalmoco, @saida)) - @maximoextras ) > 0   
        THEN   
            (DATEDIFF(mi, @entrada, @almoco) + DATEDIFF(mi, @voltadoalmoco, @saida)) - @maximoextras  
        ELSE   
            0  
        END AS Total_Extras_Em_Minutos 

    Um abraço,
    Raul Santos Neto
    • Marked as answer by pldylan Friday, February 06, 2009 1:57 PM
    Wednesday, February 04, 2009 7:12 PM
    Moderator
  • qual a regra como funcina ? normalmente um usuario tem uma hora espelho tipo 08:00 - 12:00 13:00 - 18:00, vc. tem 9 horas de trabalho, fixas vc. pode armazenar issso em um inteiro, depois com o datediff que retorna um inteiro vc. calcula hora padrao - hora calculada a diferenca se for negativa quer dizer hora extra caso contrario o usuario ta devendo, depois e so transformar o calculo sem usar o sinal ( -  ) caso exista em horas usando um dateadd com ono exemplo que passei,

    veja se e isso qq coisa retorne.

    Abs;


    Questoes de Infra, acesse o technet - http://forums.microsoft.com/Technet-BR/default.aspx -
    • Marked as answer by pldylan Friday, February 06, 2009 1:57 PM
    Friday, February 06, 2009 10:21 AM

All replies

  • Olá.

    Nesse caso precisará criar uma função para o retorno exato. O que pode te ajudar é o DateDiff:

    http://msdn.microsoft.com/en-us/library/ms189794.aspx

    Abs
    Wednesday, February 04, 2009 11:21 AM
  • Patricio,

    É a função que não estou conseguindo montar..
    Wednesday, February 04, 2009 12:19 PM
  • tente usar esta logica




    Declare @entrada Datetime 
    Declare @almoco Datetime
    Declare @voltadoalmoco Datetime
    Declare @saida Datetime


    -- Horario de trabalho:  10:00


    Select @entrada  = '08:00', @almoco =  '12:30', @voltadoalmoco = '13:30' , @saida = '17:00'

    Select (DateDiff(n, @entrada, @almoco) + DateDiff(n, @voltadoalmoco, @saida))/60 As Horas,
           (DateDiff(n, @entrada, @almoco) + DateDiff(n, @voltadoalmoco, @saida))%60 As Minutos



    onde a divisao da soma entre hora de entrada e saida para almoco + volda do almoco e saida a parte inteira sao horas o modulo do calculo sao os minutos.
     
    grave sempre data e hora, pois vc. podera ter problemas quando uma pesssoa por exemplo entra as 20:00 de um dia e sai pela manha no outro dia usando essa logica vc. consegue resolver esse problema, para retornar para horas vc. tem a opcao de usar um dateadd como neste exemplo

    Select Convert(varchar(05),DateAdd(n,DateDiff(n, @entrada, @almoco) + DateDiff(n, @voltadoalmoco, @saida),'00:00'),14) As Horas

    espero ter ajudado qq coisa retorne.

    Abs;


    Questoes de Infra, acesse o technet - http://forums.microsoft.com/Technet-BR/default.aspx -
    Wednesday, February 04, 2009 12:45 PM
  • Marcelo,

    Como eu faço para fazer o calculo de saldo, a consulta retornou 09:00 e o funcionario tem uma jornada de 10:00, como posso fazer o calculo?

     

    Valeu pela força

     

    Wednesday, February 04, 2009 1:24 PM
  • Olá pldylan,

    A função que você precisa é a DATEDIFF. E o exemplo do Marcelo está pronto para ser incrementado.

    Pegue o exemplo dele, e o desenvolva, criando uma variável que contenha o total de horas diárias que um funcionário possa trabalhar (8 no máximo, por exemplo.. ou 480 minutos). Pegue o valor da função do Marcelo, desconte o valor desta nova variável e pronto! Você terá o total de horas extras.

    O trabalho será as conversões entre horas e minutos e a formatação para o jeito que você quiser exibir ("10 horas e 02 minutos", ou "10h22", ou "10:22", etc.).

    Tente melhorar o exemplo, e se tiver problemas nos diga exatamente qual é a dificuldade.

    Minha dica é trabalhar primeiro em minutos, e só no final convertar para horas.

    Um abraço,
    Raul Santos Neto
    Wednesday, February 04, 2009 5:48 PM
    Moderator
  • Raul,

    Implantei a função criada pelo Marcelo, mas o calculo de extras não estou acertado fazer, pode me dar uma mão..

    valeu
    Wednesday, February 04, 2009 6:09 PM
  • Olá,

    Dê uma olhada no exemplo abaixo. Agora só falta, como falei acima, trabalhar com a conversão para horas e minutos e na formatação da saída. No exemplo do Marcelo, tem como separar em horas e minutos.


    DECLARE @entrada DATETIME    
    DECLARE @almoco DATETIME  
    DECLARE @voltadoalmoco DATETIME  
    DECLARE @saida DATETIME  
    DECLARE @maximoextras INT 
     
    SELECT @entrada      = '08:00' 
        , @almoco        = '12:30' 
        , @voltadoalmoco = '13:30'   
        , @saida         = '17:03' 
        , @maximoextras  = 480 --// em minutos: 8 x 60 = 480  
     
    SELECT (DATEDIFF(mi, @entrada, @almoco) + DATEDIFF(mi, @voltadoalmoco, @saida)) AS Total_Diario_Em_Minutos  
     
    ,   CASE WHEN ( (DATEDIFF(mi, @entrada, @almoco) + DATEDIFF(mi, @voltadoalmoco, @saida)) - @maximoextras ) > 0   
        THEN   
            (DATEDIFF(mi, @entrada, @almoco) + DATEDIFF(mi, @voltadoalmoco, @saida)) - @maximoextras  
        ELSE   
            0  
        END AS Total_Extras_Em_Minutos 

    Um abraço,
    Raul Santos Neto
    • Marked as answer by pldylan Friday, February 06, 2009 1:57 PM
    Wednesday, February 04, 2009 7:12 PM
    Moderator
  • qual a regra como funcina ? normalmente um usuario tem uma hora espelho tipo 08:00 - 12:00 13:00 - 18:00, vc. tem 9 horas de trabalho, fixas vc. pode armazenar issso em um inteiro, depois com o datediff que retorna um inteiro vc. calcula hora padrao - hora calculada a diferenca se for negativa quer dizer hora extra caso contrario o usuario ta devendo, depois e so transformar o calculo sem usar o sinal ( -  ) caso exista em horas usando um dateadd com ono exemplo que passei,

    veja se e isso qq coisa retorne.

    Abs;


    Questoes de Infra, acesse o technet - http://forums.microsoft.com/Technet-BR/default.aspx -
    • Marked as answer by pldylan Friday, February 06, 2009 1:57 PM
    Friday, February 06, 2009 10:21 AM
  • Valeu pela ajuda galera...
    Friday, February 06, 2009 1:57 PM