Usuário com melhor resposta
Calculo de horas

Pergunta
-
Pessoal tenho um banco de dados de pessoal e preciso calcular as horas positvas ou negativas dos funcionários;Horario de entrada: 08:00Horario de almoço: 12:30Horario de volta do almoço: 13:30Horario 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
Respostas
-
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- Marcado como Resposta pldylan sexta-feira, 6 de fevereiro de 2009 13:57
-
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 -- Marcado como Resposta pldylan sexta-feira, 6 de fevereiro de 2009 13:57
Todas as Respostas
-
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 -
-
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 - -
-
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 -
-
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- Marcado como Resposta pldylan sexta-feira, 6 de fevereiro de 2009 13:57
-
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 -- Marcado como Resposta pldylan sexta-feira, 6 de fevereiro de 2009 13:57
-