Jump to content

POWERED BY:

Archived

This topic is now archived and is closed to further replies.

raelpsf

Média entre horários datetime

Recommended Posts

Pessoal, tenho a seguinte dúvida..

 

Tenho uma tabela onde vai gerando log conforme o cadastro de informações no sistema..

 

Essas informações são cadastradas e gera uma coluna datetime, para saber o dia e a hora que foi cadastrada.

 

Porém, eu gostaria de tirar uma média diária, de quanto tempo levou entre um cadastro e outro..

 

Ex. hoje teve 04 cadastros..

 

09:00

 

09:10

 

09:20

 

09:30

 

Assim, a pesquisa me retornaria a resposta de 10 min de média entre um cadastro e outro.

 

Como fazer isso numa pesquisa direto no banco?

 

Tabela: interacoes

coluna: data

 

De preferencia, com a opção de eu escolher o dia da consulta (between), não somente para "hoje".

 

Muito Obrigado.



Dúvida adicional.. tem como o sistema levar em consideração a 01 hora de almoço do funcionário.. tipo..

 

Soma as horas, desconta 01 hora, e divide pelo número de entradas.. algo assim?

Share this post


Link to post
Share on other sites

A chave deve ser um id sequencial.

Faça um join da tabela com ela mesma de forma que id=(id-1), ou seja um registro será ligadonao anterior.

Calcule a diferença em minutos.

Calcule a média desta diferença.

Share this post


Link to post
Share on other sites

Ai que tá.. não conheço as entradas do mysql pra fazer esses cálculos.. eu estou aprendendo sobre mysql e a maioria dos códigos que uso, são adaptações que faço de outros que já conheço..

 

Mas esse tipo de pesquisa nunca fiz.. se alguém puder me ajudar com a construção deste select eu ia agradecer.. não conheço as variáveis..

 

E para constar.. mota.. a planilha tem um id sequencial sim.. deixei o nome de "id" msm..

 

Também só para constar.. são cerca de 100 registros por dia.. então as média vai ter que levar isso tudo em conta.

Share this post


Link to post
Share on other sites

obter a data

select data
from tabela

ligando a anterior

 

select *
from tabela t1,tabela t2
where t1.id  = (t2.id-1)

dif. entre datas

 

select (t1.data - t2.data) 
from tabela t1,tabela t2
where t1.id  = (t2.id-1)

 

A diferença entre datas é em dias logo se multiplicar por 24 e por 60 terá em munutos

 

 

select 24 * 60 * (t1.data - t2.data) 
from tabela t1,tabela t2
where t1.id  = (t2.id-1)

média desta história

 

select avg (24 * 60 * (t1.data - t2.data) )
from tabela t1,tabela t2
where t1.id  = (t2.id-1)

Share this post


Link to post
Share on other sites

Só pra ver se eu entendi.. as datas estão todas na tabela interacoes.. então ficaria..

 

 

 

 

select avg (24 * 60 * (interacoes.data - interacoes.data) ) from interacoes,interacoes where interacoes.id  = (interacoes.id-1)

 

???

Share this post


Link to post
Share on other sites

Não, como a tabela e referenciada duas vezes é preciso de um aliais

select avg(24 * 60 * (i2.data - i1.data)) media
from interacoes i1,interacoes i2
where i1.id  = (i2.id-1)

 

 




			
		

Share this post


Link to post
Share on other sites

Entendi...

 

O resultado foi esse..

 

416919732.9735487000

 

Acredito pq ele puxou os vários meses que o banco tem..

 

Como faço para limitar para a data X apenas?

Share this post


Link to post
Share on other sites

Não, fiz bobagem ...

Tem de dividir pois o resultado é em dias.

 

select avg(((i2.data - i1.data)/(24 * 60)) media 
from interacoes i1,interacoes i2 
where i1.id  = (i2.id-1)

 

Como faço para limitar para a data X apenas?

 

Condição no WHERE ...

 

30 últimos dias (por exemplo)

 

select avg(((i2.data - i1.data)/(24 * 60)) media 
from interacoes i1,interacoes i2 
where i1.id  = (i2.id-1) 
and i1.data >= (now() -30)

Veja o manual do MySql para detalhes do uso do SQL.

 

 

 




			
		

Share this post


Link to post
Share on other sites

Cara primeiro deu erro de sintax, ai eu tirei um dos ( , ali de depois do avg, ai foi.. mas tá retornando NULL.. o que pode ser?

Share this post


Link to post
Share on other sites

Alguma data nula talvez, acrescente um

 

and data i1.data is not null
and data i2.data is not null

a query

 

publica como ficou a query

Share this post


Link to post
Share on other sites

Fiz assim... mas retornou null igual..

 

O estranho é que é impossível ter data nula, pq a data é inserida no momento do cadastro da informação.. ela pega a hora e data do ato do cadastro..

 

SELECT avg( (
i2.data - i1.data
) / ( 24 *60 ) ) media
FROM interacoes i1, interacoes i2
WHERE i1.id = ( i2.id -1 )
AND i1.data >= ( now( ) -30 )
AND i1.data IS NOT NULL
AND i2.data IS NOT NULL 

Share this post


Link to post
Share on other sites

Corrigindo ...

é para multiplicar mesmo , pois

1dia = 24 horas

1 h = 60 minutos

1 dia = 1440 minutos

SELECT avg((24 * 60 * (i2.data - i1.data))) media 
FROM interacoes i1, interacoes i2 
WHERE i1.id = ( i2.id -1 ) 
AND i1.data >= ( now( ) -30 ) 
AND i1.data IS NOT NULL 
AND i2.data IS NOT NULL 
1) o que isto retorna ?
SELECT i1.id,i1.data,(24 * 60 * (i2.data - i1.data)) x,i2.id,i2.data
FROM interacoes i1, interacoes i2 
WHERE i1.id = ( i2.id -1 ) 
AND i1.data >= ( now( ) -30 ) 
AND i1.data IS NOT NULL 
AND i2.data IS NOT NULL 

 




			
		

Share this post


Link to post
Share on other sites

O normal retornou null..

 

O que tu botou no 01) retornou..

 

MySQL retornou um conjunto vazio (ex. zero registros). ( Consulta levou 0.3722 segundos )

Share this post


Link to post
Share on other sites

se isto

SELECT i1.id,i1.data,(24 * 60 * (i2.data - i1.data)) x,i2.id,i2.data 
FROM interacoes i1, interacoes i2 
WHERE i1.id = ( i2.id -1 ) 
AND i1.data >= DATE_SUB(data,INTERVAL 31 DAY)
AND i1.data IS NOT NULL 
AND i2.data IS NOT NULL 

retornar linhas

 

rode ...

 

SELECT avg(24 * 60 * (i2.data - i1.data)) x 
FROM interacoes i1, interacoes i2 
WHERE i1.id = ( i2.id -1 ) 
AND i1.data >= DATE_SUB(data,INTERVAL 31 DAY)
AND i1.data IS NOT NULL 
AND i2.data IS NOT NULL 

 

 




			
		

Share this post


Link to post
Share on other sites

Nas duas opções retorna...

 

#1052 - Column 'data' in where clause is ambiguous

Share this post


Link to post
Share on other sites
SELECT avg(24 * 60 * (i2.data - i1.data)) x 
FROM interacoes i1, interacoes i2 
WHERE i1.id = ( i2.id -1 ) 
AND i1.data >= DATE_SUB(NOW(),INTERVAL 31 DAY) 
AND i1.data IS NOT NULL 
AND i2.data IS NOT NULL 

 

 




			
		

Share this post


Link to post
Share on other sites

Muito alto, estranho ... tente com DATEDIFF

 

SELECT avg(24 * 60 * (DATEDIFF(i2.data,i1.data))) x 
FROM interacoes i1, interacoes i2 
WHERE i1.id = ( i2.id -1 ) 
AND i1.data >= DATE_SUB(NOW(),INTERVAL 31 DAY) 
AND i1.data IS NOT NULL 
AND i2.data IS NOT NULL 

 

 




			
		

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.