Ir para conteúdo

Arquivado

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

EmersonPFS

Calcular diferença de Horas entre linhas

Recommended Posts

Fala galera...

Preciso de um grande help...

 

Tenho o seguinte resultado em uma determinada consulta:

JOB STATUS DATA/HORA RELATORIO

20701129 D 11-09-2009 02:03:41 R5576432

20701129 P 11-09-2009 02:03:23 R5576432

20701130 D 11-09-2009 02:17:27 R5549005

20701130 P 11-09-2009 02:17:21 R5549005

20701131 D 11-09-2009 02:17:35 R5549005

20701131 P 11-09-2009 02:17:30 R5549005

20701132 D 11-09-2009 02:03:50 R5543001A

20701132 P 11-09-2009 02:03:45 R5543001A

 

Como mostra acima, o JOB ao executar, grava a hora de inicio e na outra linha a hora de termino.

Preciso calcular a diferença de hora entre inicio e fim de execução. No exemplo acima a primeira linha seria (11-09-2009 02:03:41 - 11-09-2009 02:03:23) que daria um total de 18 segundos.

 

Alguem tem ideia de como posso calcular esta difrença?

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom cara,

 

Eu tenho uma sugestao a te fazer....

 

Porque ao inves de voce dar um INSERT nesta tabela, voce nao dah um UPDATE ???

 

Insere quando inicia, e update ao termino, entao voce cria mais colunas na tabela, e consegue colocar num computed column, ou ateh mesmo forçar o update com a conta, sem ter que consumir processamento do banco para computed column.

 

Entao...

Iniciou um JOB:

declare @job_id int;
Insert into tabela (campos, hora_inicio) values (valores, getdate());
select @job_id = @@identity;

/*
Todo o processamento...
*/

update tabela 
set 
campo = valores
, hora_final = getdate()
, diferenca_tempo = DATEDIFF(second,hora_inicio,getdate()) 
where 
campo_id = @job_id;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Junior..

Então cara... o problema não é em calcular a hora... para isso posso usar o DATEDIFF, mas só consegui fazer funcionar se estiverem em colunas separadas tipo uma coluna para execução.. .e outra colula para concluido

Nao estou conseguindo montar o SQL para pegar as datas a serem subtraidas da mesma colula... entendeu?

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom cara,

 

nesse caso ai voce pode fazer um subselect

Entao ficaria....

 

Select 
*
, DATEDIFF(second, [data/hora],(select b.[data/hora] from tabela_job as b where b.[job] = a.[job] and b.status = 'D') as [diferenca]
from 
tabela_job as a 
where 
status = 'P';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Temos um problema com o datediff...

o datediff tem como parametro o SECOND e se o resultado for > 60 ou o resultado for em horas? (se bem que nao eh este caso, mas pode acontecer)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Temos um problema com o datediff...

o datediff tem como parametro o SECOND e se o resultado for > 60 ou o resultado for em horas? (se bem que nao eh este caso, mas pode acontecer)

 

Então cara... to contornando a situação jogando resultados = P na tatela temp_p e resultados = D na tabela temp_d... e depois rodando um datediff de uma tabela para a outra... e deu certo... mas na gambi né... seria bom mesmo eliminar essas tabelas temporarias.. e fazer diretamente...

 

Se tiverem alguma ideia...

 

Abraços.

 

Bom cara,

 

nesse caso ai voce pode fazer um subselect

Entao ficaria....

 

Select 
*
, DATEDIFF(second, [data/hora],(select b.[data/hora] from tabela_job as b where b.[job] = a.[job] and b.status = 'D') as [diferenca]
from 
tabela_job as a 
where 
status = 'P';

 

Entao cara... tentei... e nao deu certo... mas acho que consegui contornar a situação com uma gambi...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom cara,

 

Eu tenho uma sugestao a te fazer....

 

Porque ao inves de voce dar um INSERT nesta tabela, voce nao dah um UPDATE ???

 

Insere quando inicia, e update ao termino, entao voce cria mais colunas na tabela, e consegue colocar num computed column, ou ateh mesmo forçar o update com a conta, sem ter que consumir processamento do banco para computed column.

 

Entao...

Iniciou um JOB:

declare @job_id int;
Insert into tabela (campos, hora_inicio) values (valores, getdate());
select @job_id = @@identity;

/*
Todo o processamento...
*/

update tabela 
set 
campo = valores
, hora_final = getdate()
, diferenca_tempo = DATEDIFF(second,hora_inicio,getdate()) 
where 
campo_id = @job_id;

 

Esses dados eu não manupulo... eles são simplesmente extraidos do AS400 via openquery... quem controla a atualização dessa tabela é o ERP e ele grava desse modo.

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.