Diferença entra horas

Harold,

O problema está em pegar o registro atual e subtrair do anterior…

COmo citei ao Diogo

usa sub-select

Harold,

Como usaria um sub-select para isso…

Tem como me ajudar?

você de certa forma fez 2 sub-selects no from do select principal.
faça o sub-select retornando a data e hora de saída.
para executar melhor a avaliação precisaria ter a modelagem dos dados (populados) para efetuar testes, pois na teoria tudo funciona, mas na pratica nem sempre…

Quando chegar em casa te envio

Como Harold falou … precisaria pegar o registro anterior.

Como tem que ser generico para cada registro … teria que pegar o registro anterior …(se a ordem for pela chave primaria)… so dar um select pegando o registro anterior onde a chave for menor que a atual com limit 0,1 pra trazer apenas 1 registro … espero que de pra entender :-p

se tenho
select codigo, nome from clientes
o registro anterior a esse seria:

select
cli1.codigo,
cli1.nome,
(SELECT cli2.codigo FROM clientes where cli2.codigo < cli1.codigo order by cli2.codigo DESC limit 0,1)
from
clientes
order by
cli1.codigo ASC

juro que fiz de cabeca agora e foi a primeira solucao que me veio(creio que esta correto) … depois o pessoal fala mais sugestao ai …

Diogo,

Vou testar sua solução e já post se deu certo…

Valeu…

Diogo

Usando a minha tabela seria mais ou menos isso como você fez acima, mas está dando erro #1241 - Operand should contain 1 column(s)

SELECT
gm.Idaut, 
gm.Data,
gm.Idcarro,
gm.HoraSaida,
gm.Sentido,
(SELECT g.Idaut,g.HoraSaida, timediff(time(g.HoraSaida),time(gm.HoraSaida)) FROM guiasmov g where g.Idaut < gm.Idaut order by g.Idaut DESC  limit 0,1) AS INTERVALOI
FROM guiasmov gm
WHERE
gm.Data = '2009-09-01' AND
gm.Idcarro Between 100 AND 130 AND
gm.Idlinha = 13
AND gm.Sentido = 0

É pq subselect, para funcionar como 1 campo, deve retornar apenas 1 campo no select.

SELECT timediff(time(g.HoraSaida),time(gm.HoraSaida)) FROM guiasmov g where g.Idaut < gm.Idaut order by g.Idaut DESC limit 0,1

Diogo,

com esse select

SELECT
gm.Idaut AS ID1,
TIME(gm.HoraSaida) as HORAID1,
(SELECT g.Idaut FROM guiasmov g where g.Idaut < gm.Idaut order by g.Idaut DESC  limit 0,1) AS ID2,
(SELECT TIME(g2.HoraSaida) FROM guiasmov g2 where g2.Idaut = Id2) as HORAID2
FROM guiasmov gm
order by 
gm.Idaut DESC
LIMIT 0,10  
  

Consegui esse resultado, só não consegui o TIMEDIFF

212220;"20:42:00";212219;"20:07:00"
212219;"20:07:00";212218;"19:23:00"
212218;"19:23:00";212217;"18:27:00"
212217;"18:27:00";212216;"16:51:00"
212216;"16:51:00";212215;"16:17:00"
212215;"16:17:00";212214;"15:28:00"
212214;"15:28:00";212213;"14:56:00"
212213;"14:56:00";212212;"14:18:00"
212212;"14:18:00";212211;"13:39:00"
212211;"13:39:00";212210;"12:56:00"

o timediff funciona direitinho, mas acho que temque passar com a data junto:

SELECT TIMEDIFF(‘2008-12-31 23:59:59.000001’,
-> ‘2008-12-30 01:01:01.000002’);
-> ‘46:58:57.999999’

Harold,

Tá funcionando direitinho com o TIMEDIFF… porém nem tudo é perfeito…

Os ids não são sequenciais…

Select:

SELECT
gm.Idaut AS IDIDA,
gm.IdGuia AS GIDA, 
DATE_FORMAT(gm.Data,'%d/%m/%Y') as DATAI,
gm.Viagem as ViagensI,
gm.Turma as TURMAI,
gm.Idcarro as CARROI, 
gm.IdLinha as LINHAI , 
gm.Sentido as IDA, 
DATE_FORMAT(gm.HoraSaida,'%H:%i') as SAIDAI, 
DATE_FORMAT(gm.HoraChegada,'%H:%i')as CHEGADAI, 
DATE_FORMAT(gm.Tempo,'%H:%i') as TEMPOI, 
gm.Passageiros as PAXI,
(SELECT gm1.Idaut FROM guiasmov gm1 where gm1.Idaut < gm.Idaut order by gm.Idaut DESC  limit 0,1) AS ID2,
(SELECT TIMEDIFF(DATE_FORMAT(gm.HoraSaida,'%H:%i'),DATE_FORMAT(HoraSaida,'%H:%i')) FROM guiasmov where Idaut = Id2) AS INTERVALOIDA
FROM guiasmov gm 
WHERE
gm.Data = '2009-09-01' AND
gm.Idcarro Between 100 AND 130 AND
gm.Idlinha = 13
AND gm.Sentido = 0
ORDER BY 
SAIDAI
  

Resultado:

"IDIDA""GIDA""DATAI""ViagensI""TURMAI""CARROI""LINHAI""IDA""SAIDAI""CHEGADAI""TEMPOI""PAXI""ID2""INTERVALOIDA"
198495      63413       01/09/2009  1           1       104         13          0           03:58  10:03      06:05   291         198494       -15:32:00          
198731      63457       01/09/2009  1           1       128         13          0           04:08  05:08      01:00   12          198730       -17:27:00          
198620      63432       01/09/2009  1           1       114         13          0           04:30  05:29      00:59   17          198619       -18:19:00          
198581      63425       01/09/2009  1           1       111         13          0           04:32  05:32      01:00   39          198580       -09:12:00          
198705      63453       01/09/2009  1           1       126         13          0           05:21  06:16      00:55   48          198704       -16:55:00          
198485      63411       01/09/2009  1           1       103         13          0           05:41  06:32      00:51   51          198484       -15:18:00          
198733      63457       01/09/2009  2           1       128         13          0           06:01  07:14      01:13   56          198732       00:53:00           
198699      63451       01/09/2009  1           1       125         13          0           06:27  09:20      02:53   194         198698       -09:57:00          

Diogo,
Tem alguma ideia de como fazer usando esse SELECT?
Teria que ser :

198731 - 198495

O que eu tava falnado era isso aqui:

SELECT gm.Idaut, gm.Data, gm.Idcarro, gm.HoraSaida, gm.Sentido, (SELECT timediff(time(g.HoraSaida),time(gm.HoraSaida)) FROM guiasmov g where g.Idaut < gm.Idaut order by g.Idaut DESC limit 0,1) AS INTERVALOI FROM guiasmov gm WHERE gm.Data = '2009-09-01' AND gm.Idcarro Between 100 AND 130 AND gm.Idlinha = 13 AND gm.Sentido = 0

ou

SELECT gm.Idaut, gm.Data, gm.Idcarro, gm.HoraSaida, gm.Sentido, timediff( (SELECT time(g.HoraSaida) FROM guiasmov g where g.Idaut < gm.Idaut order by g.Idaut DESC limit 0,1 ),time(gm.HoraSaida)) AS INTERVALOI FROM guiasmov gm WHERE gm.Data = '2009-09-01' AND gm.Idcarro Between 100 AND 130 AND gm.Idlinha = 13 AND gm.Sentido = 0

a ideia …

Diogo,

Como citei acima o problema é que os Ids não são sequenciais…

Diogo,

Tem alguma idéia para IDS não sequenciais?

É isso que to dizendo … o que vai importar e muito eh saber a ordem … pois se nao o anterior vai pegar errado.

Qual a ordem que voce quer usar? Mostra o order by original e o interno vai ser ele ao contrario ja que voce quer pegar apenas o primeiro da lista… pra poder fazer o where direito …

Diogo,

O select da aplicação é esse com o ORDER BY pela HORAI

SELECT gm.Idaut AS IDIDA, gm.IdGuia AS GIDA, DATE_FORMAT(gm.Data,'%d/%m/%Y') as DATAI, gm.Viagem as ViagensI, gm.Turma as TURMAI, gm.Idcarro as CARROI, gm.IdLinha as LINHAI , gm.Sentido as IDA, DATE_FORMAT(gm.HoraSaida,'%H:%i') as SAIDAI, DATE_FORMAT(gm.HoraChegada,'%H:%i')as CHEGADAI, DATE_FORMAT(gm.Tempo,'%H:%i') as TEMPOI, gm.Passageiros as PAXI, (SELECT gm1.Idaut FROM guiasmov gm1 where gm1.Idaut < gm.Idaut order by gm.Idaut DESC limit 0,1) AS ID2, (SELECT TIMEDIFF(DATE_FORMAT(gm.HoraSaida,'%H:%i'),DATE_FORMAT(HoraSaida,'%H:%i')) FROM guiasmov where Idaut = Id2) AS INTERVALOIDA FROM guiasmov gm WHERE gm.Data = '2009-09-01' AND gm.Idcarro Between 100 AND 130 AND gm.Idlinha = 13 AND gm.Sentido = 0 ORDER BY SAIDAI

E o resultado esse:

"IDIDA""GIDA""DATAI""ViagensI""TURMAI""CARROI""LINHAI""IDA""SAIDAI""CHEGADAI""TEMPOI""PAXI""ID2""INTERVALOIDA" 198495 63413 01/09/2009 1 1 104 13 0 03:58 10:03 06:05 291 198494 -15:32:00 198731 63457 01/09/2009 1 1 128 13 0 04:08 05:08 01:00 12 198730 -17:27:00 198620 63432 01/09/2009 1 1 114 13 0 04:30 05:29 00:59 17 198619 -18:19:00 198581 63425 01/09/2009 1 1 111 13 0 04:32 05:32 01:00 39 198580 -09:12:00 198705 63453 01/09/2009 1 1 126 13 0 05:21 06:16 00:55 48 198704 -16:55:00 198485 63411 01/09/2009 1 1 103 13 0 05:41 06:32 00:51 51 198484 -15:18:00 198733 63457 01/09/2009 2 1 128 13 0 06:01 07:14 01:13 56 198732 00:53:00 198699 63451 01/09/2009 1 1 125 13 0 06:27 09:20 02:53 194 198698 -09:57:00

voce ta falando que eh HORAI, mas no seu select tem:

ORDER BY
SAIDAI

se a ordem eh pela SAIDAI ASC … anteao o anterior dele seria o primeiro registro do SAIDAI DESC menor que ele …
(SELECT timediff(time(g.HoraSaida),time(gm.HoraSaida)) FROM guiasmov g where g.Idaut < gm.Idaut order by g.HoraSaida DESC limit 0,1)

acho que voce que nao entendeu ainda … melhor tirar do sql que tu tas misturando ja e faz no onRecord pra pegar o registro anteior a ele … melhor.

Diogo,
Desculpa te perturbar, mas como ficaria no onRecord?

Vamos exercitar …

baseado no segundo registro …

"IDIDA""GIDA""DATAI""ViagensI""TURMAI""CARROI""LINHAI""IDA""SAIDAI""CHEGADAI""TEMPOI""PAXI""ID2""INTERVALOIDA" 198495 63413 01/09/2009 1 1 104 13 0 03:58 10:03 06:05 291 198494 -15:32:00 198731 63457 01/09/2009 1 1 128 13 0 04:08 05:08 01:00 12 198730 -17:27:00 198620 63432 01/09/2009 1 1 114 13 0 04:30 05:29 00:59 17 198619 -18:19:00 198581 63425 01/09/2009 1 1 111 13 0 04:32 05:32 01:00 39 198580 -09:12:00 198705 63453 01/09/2009 1 1 126 13 0 05:21 06:16 00:55 48 198704 -16:55:00 198485 63411 01/09/2009 1 1 103 13 0 05:41 06:32 00:51 51 198484 -15:18:00 198733 63457 01/09/2009 2 1 128 13 0 06:01 07:14 01:13 56 198732 00:53:00 198699 63451 01/09/2009 1 1 125 13 0 06:27 09:20 02:53 194 198698 -09:57:00

Quem é o registro anterior ao segundo registro … olhando o codigo, como vc representaria isso via sql?