Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

yuris

Retornar Horas SQL

Recommended Posts

Ola

Preciso que minha consulta ao banco de dados retorne o numero de horas que cada funcionario da empresa trabalha.. ok, porém se o numero de horas ultrapassa 99 ele nao chama e da erro..alguem pode me ajudar???

minha consulta eh essa:

DECLARE @RegistroTarefa TABLE(NumFuncionario INT, TempoTrabalhado VARCHAR(8))	INSERT INTO @RegistroTarefa	SELECT NumFuncionario, TempoTrabalhado from RegistroTArefa R where R.DtSistema >= '2007/07/17 00:00'  AND  R.DtSistema <= '2007/07/17 23:59'		SELECT F.NumFuncionario, Nome ,ISNULL(dbo.ConverteHora(sum((datepart(hh,CAST( TempoTrabalhado AS DATETIME)) * 60 + datepart(mi,CAST( TempoTrabalhado AS DATETIME))))),'00:00')  AS TotalHorasTrabalhadas	FROM 	(	Funcionario F left JOIN @RegistroTArefa R ON F.NumFuncionario = R.NumFuncionario 	)	WHERE F.ativo = 1	GROUP BY F.NumFuncionario, Nome 	ORDER BY Nome
Nao entendo muito de Banco de dados entao to meio atrasado com essa questao no meu trabalho.. agradeço quem puder ajudar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

como esta a função dbo.ConverteHora?

 

passa os dados de um funcionario tb. pra testar

Compartilhar este post


Link para o post
Compartilhar em outros sites

a funcao dbo.ConverteHora é essa:

 

set ANSI_NULLS ONset QUOTED_IDENTIFIER ONGOALTER	 FUNCTION [dbo].[ConverteHora] (@Valor int)  RETURNS VARCHAR(10)ASbegin		DECLARE @ConverteHora as VARCHAR(10)	DECLARE @ValorHora as float		DECLARE @Hora as int	DECLARE @Minutos as int	DECLARE @ValorRestante AS int	DECLARE @DecimalHora As float	SET @DecimalHora = (cast(@Valor as float)/ 60)	SET @Hora = cast(@DecimalHora as int)	SET @Minutos = cast( (  ((@Hora - @DecimalHora)* -1 ) * 60) as int)	IF len(@minutos) = 1		begin		  SET @minutos = CAST( (CAST(@minutos AS VARCHAR(2)) + '0') AS INT)		end 		IF (@Minutos > 60)		   		BEGIN						SET @ValorRestante = @Minutos - 60						SET @Hora = @Hora +  1						SET @Minutos = @ValorRestante			END 		 	ELSE IF (@Minutos = 60)		   		BEGIN						SET @Hora = @Hora + 1						SET @Minutos = 0			END  		  SET @ConverteHora =  cast(@Hora AS varchar(10)) + ':' + right('0'+cast(@Minutos AS Varchar(2)),2)	RETURN @ConverteHoraend

 

 

dados funcionario:

 

numfuncionario = 1

nome = teste

telefone = (11)33343434

datanascimento = 01/01/1980

departamento = ADM

login = t

senha = t

ativo = 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

a função esta correta, esta em minutos, se enviar 6600 minutos retorna 110:00 horasverifique qto. esta sendo passado para a funçãosobre os dados do funcionario estava me referindo ao numero de horas ou minutos...rsss, testai qq. coisa passe o numero de horas ou minutos e como você esta fazendo para calculart+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tipo..a tabela RegistroTarefa guarda a informacao das horas computadas pelos funcionarios, assim ela guarda 03:00 horas, mais 05:00 horas e assim por diante.. quando faço a consulta ele me soma as horas cadastradas de cada funcionario de acordo com a data que eu boto... se esse numero de horas passa de 99:00 ele da o seguinte erro:Msg 242, Level 16, State 3, Line 6The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.a propria query ja chama a funcao que soma as datas =(To entrando em desespero aqui =/// Na tabela de RegistroTarefa sao guardadas as informacoes de cada hora gravada associada a uma tarefa e também a data de cadastro.Nao seria algo a ver com o DatePart que me tras um tipo "hh" e depois "mi" - "00:00" por exemplo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

testei aqui desta forma e retornou 115:00

 

declare @tb_teste table (campo datetime)insert into @tb_teste (campo) values ('23:00')insert into @tb_teste (campo) values ('23:00')insert into @tb_teste (campo) values ('23:00')insert into @tb_teste (campo) values ('23:00')insert into @tb_teste (campo) values ('23:00')select ISNULL(dbo.ConverteHora(sum((datepart(hh,CAST( campo AS DATETIME)) * 60 + datepart(mi,CAST( campo AS DATETIME))))),'00:00') from @tb_teste

tenta simular os seus dados nessa tabela virtual

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vlw mesmo Eriva, o problema era que tinha campos cadastrados com horas acima de 23:59.. o que nao condiz com um relatorio Diário!Assim sendo, vou modificar minha aplicaçao impedindo que se cadestre tal absurdo de horas num dia heheMas apenas por um encargo de consciencia.. tem como eu ajustar esse limite no proprio sqlserver? ou esse numero de horas é unico e deu? Algo que me permita cadastrar por exemplo 50:00 hs direto nele e ele aceite.. para o caso de eu fazer uma aplicaçao onde se possa compensar horas esquecidas de computar.Abs e obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vlw mesmo Eriva, o problema era que tinha campos cadastrados com horas acima de 23:59.. o que nao condiz com um relatorio Diário!

Assim sendo, vou modificar minha aplicaçao impedindo que se cadestre tal absurdo de horas num dia hehe

Mas apenas por um encargo de consciencia.. tem como eu ajustar esse limite no proprio sqlserver? ou esse numero de horas é unico e deu? Algo que me permita cadastrar por exemplo 50:00 hs direto nele e ele aceite.. para o caso de eu fazer uma aplicaçao onde se possa compensar horas esquecidas de computar.

Abs e obrigado.

yuris,

 

Usando campo do tipo datetime creio que isso não será possível, testei e não consegui, só se fizer uma adptação usando campos numericos ou char, nesse caso existem riscos de compatibilidade que deverão ser analisados no contexto de sua aplicação.

 

 

abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.