Diferença entra horas

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?

Diogo,

Por estar quebrando a cabeça para resolver isso não consego ver mais nada, Seria algo :

Select timediff(198731,198495) from guiasmov ....

Po, poe o sql ai do jeito que esta na sua aplicação.

select a.*, b.* from
(
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.IdGuia FROM guiasmov gm1 where gm1.IdGuia < gm.IdGuia AND gm.Sentido = 0 order by gm1.IdGuia DESC  limit 0,1) AS ID2,
(SELECT TIMEDIFF(DATE_FORMAT(gm.HoraSaida,'%H:%i'),DATE_FORMAT(HoraSaida,'%H:%i')) FROM guiasmov where IdGuia = ID2 AND gm.Sentido = 0) 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
)a,
(
SELECT
g.Idaut AS IDVOLTA, 
g.IdGuia as GVOLTA,
DATE_FORMAT(g.Data,'%d/%m/%Y') as DATAV,
g.Viagem as ViagensV, 
g.Turma as TURMAV, 
g.Idcarro as CARROV, 
g.IdLinha as LINHAV, 
g.Sentido as VOLTA, 
DATE_FORMAT(g.HoraSaida,'%H:%i') as SAIDAV, 
DATE_FORMAT(g.HoraChegada,'%H:%i') as CHEGADAV, 
DATE_FORMAT(g.Tempo,'%H:%i') as TEMPOV, 
g.Passageiros as PAXV,
(SELECT gm2.IdGuia FROM guiasmov gm2 where gm2.IdGuia < g.IdGuia AND g.Sentido = 1 order by gm2.IdGuia DESC  limit 0,1) AS ID2V,
(SELECT TIMEDIFF(DATE_FORMAT(g.HoraSaida,'%H:%i'),DATE_FORMAT(HoraSaida,'%H:%i')) FROM guiasmov where IdGuia = ID2V AND g.Sentido = 1) AS INTERVALOVOLTA
FROM guiasmov g WHERE 
g.Data = '2009-09-01' AND
g.Idcarro Between 100 AND 130 AND
g.Idlinha = 13
AND g.Sentido = 1
)b 
WHERE  b.ViagensV = a.ViagensI and b.TURMAV = a.TURMAI AND b.GVOLTA = a.GIDA
ORDER BY SAIDAI

Diogo / Harold,

Obrigadão pelo empenho em me ajudar a resolver meus select meio complexo…

Depois de descançar muito voltei a testar o select e consegui resolver o problema. Só ficou meio lento, se vocês tiverem alguma idéia para melhorar o select…

SELECT gm.Idaut AS IDIDA, DATE_FORMAT(gm.Data,'%d/%m/%Y') as DATAI, gm.Idcarro as CARROI, gm.IdLinha as LINHAI , gm.Sentido as IDA, DATE_FORMAT(gm.HoraSaida,'%H:%i') as SAIDAI, gm.Passageiros as PAXI, (SELECT DATE_FORMAT(gm1.HoraSaida,'%H:%i') AS SAI_ANTES FROM guiasmov gm1 where DATE_FORMAT(gm1.HoraSaida,'%H:%i') < DATE_FORMAT(gm.HoraSaida,'%H:%i') AND gm1.Data = '2009-09-01' AND gm1.Idcarro Between 1 AND 200 AND gm1.Idlinha = 13 AND gm1.Sentido = 0 ORDER BY SAI_ANTES DESC LIMIT 0,1) AS SAI1, TIMEDIFF(DATE_FORMAT(gm.HoraSaida,'%H:%i'),(SELECT DATE_FORMAT(gm1.HoraSaida,'%H:%i') AS SAI_ANTES FROM guiasmov gm1 where DATE_FORMAT(gm1.HoraSaida,'%H:%i') < DATE_FORMAT(gm.HoraSaida,'%H:%i') AND gm1.Data = '2009-09-01' AND gm1.Idcarro Between 1 AND 200 AND gm1.Idlinha = 13 AND gm1.Sentido = 0 ORDER BY SAI_ANTES DESC LIMIT 0,1) ) AS INTERVALOIDA FROM guiasmov gm WHERE gm.Data = '2009-09-01' AND gm.Idcarro Between 1 AND 200 AND gm.Idlinha = 13 AND gm.Sentido = 0 ORDER BY SAIDAI LIMIT 11

Resultado:

"IDIDA"       "DATAI"     "CARROI""LINHAI"  "IDA"       "SAIDAI"  "PAXI"    "SAI1"   "INTERVALOIDA"
199191      01/09/2009  167         13          0           00:27  22          NULL      NULL               
200206      01/09/2009  87          13          0           00:31  24          00:27     00:04           
198276      01/09/2009  82          13          0           00:33  21          00:31     00:02           
198867      01/09/2009  145         13          0           01:16  5           00:33     00:43           
197521      01/09/2009  5           13          0           02:00  15          01:16      00:44
199193      01/09/2009  167         13          0           02:24  10          02:00    00:24
200208      01/09/2009  87          13          0           02:39  29          02:24     00:15           
  

estas usando indice nos campos que sao mais usados para order by e where?

Sim. Não tem como fazer essa query com Left Join?

So testando … nao sei como comportaria a parte de ordenação, pois eh principio para poder pegar o registro anterior.

Testaria colocar numa view tbm para rodar direto do banco … sei q mysql eh meio lento com view e montando subselectes dinamicos, pois ele tentar criar uma tabela temporaria fisicamente e vai alimentando ela e depois eh q exibe.
Ai tem q ver qual teu banco, configurar para colocar em memoria … ai sao outros 500 … performance.

Beleza, tem como me ajudar no meu outro topico…
http://www.netmake.com.br/forum/index.php?topic=2336.0