Calculo de tempo médio SQL

SQL

Delphi

Firebird

25/05/2018

Bom dia amigos
tenho a seguinte consulta.

select a.cdfil, a.nrrqu, a.serier, a.data, a.hora, a.cdetapa, b.descricao from fc12500 a, fc12540 b   where

                b.cdetapa=a.cdetapa and

                a.nrrqu= 6650 and
                a.cdopera=1


                order by a.data, a.hora


ele retorna todas as etapas com um campo contendo a data e outro campo contendo a hora.

como eu poderia fazer para calcular o tempo entre uma etapa e outra?

no aguardo da ajuda de voces um forte abraço.
Reginaldo Souza

Reginaldo Souza

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

25/05/2018

supondo que seu campo a.data seja do tipo data, e o seu campo a.hora seja caractere, você pode obter o tempo da etapa anterior assim:

select
  a.cdfil, a.nrrqu, a.serier, a.cdetapa, b.descricao,
  convert(datetime, cast(a.data as varchar(10))+' '+a.hora) datahoraatual,
  (select top 1 convert(datetime, cast(a2.data as varchar(10))+' '+a2.hora)
   from fc12500 a2
   where a2.nrrqu = a.nrrqu and
     a2.cdopera = a.cdopera and
     convert(datetime, cast(a2.data as varchar(10))+' '+a2.hora) <
        convert(datetime, cast(a.data as varchar(10))+' '+a.hora)
   order by convert(datetime, cast(a2.data as varchar(10))+' '+a2.hora) desc) datahoraanterior
from
  fc12500 a
inner join
  fc12540 b on b.cdetapa = a.cdetapa
where
  a.nrrqu = 6650 and
  a.cdopera = 1
order by
  a.data, a.hora



e, para calcular o tempo decorrido entre elas, pode ser assim (pode ter algum erro de sintaxe, mas a idéia geral é essa):
select
  t.*,
  convert(time, t.datahoraatual - t.datahoraanterior, 8) intervalo
from (
select
  a.cdfil, a.nrrqu, a.serier, a.cdetapa, b.descricao,
  convert(datetime, cast(a.data as varchar(10))+' '+a.hora) datahoraatual,
  (select top 1 convert(datetime, cast(a2.data as varchar(10))+' '+a2.hora)
   from fc12500 a2
   where a2.nrrqu = a.nrrqu and
     a2.cdopera = a.cdopera and
     convert(datetime, cast(a2.data as varchar(10))+' '+a2.hora) <
        convert(datetime, cast(a.data as varchar(10))+' '+a.hora)
   order by convert(datetime, cast(a2.data as varchar(10))+' '+a2.hora) desc) datahoraanterior
from
  fc12500 a
inner join
  fc12540 b on b.cdetapa = a.cdetapa
where
  a.nrrqu = 6650 and
  a.cdopera = 1
) t
order by
  t.data, t.hora

GOSTEI 2

Mais Respostas

Reginaldo Souza

Reginaldo Souza

25/05/2018

vou testar aqui e ja posto o resultado. vamos ver
GOSTEI 0
Reginaldo Souza

Reginaldo Souza

25/05/2018

supondo que seu campo a.data seja do tipo data, e o seu campo a.hora seja caractere, você pode obter o tempo da etapa anterior assim:

select
  a.cdfil, a.nrrqu, a.serier, a.cdetapa, b.descricao,
  convert(datetime, cast(a.data as varchar(10))+' '+a.hora) datahoraatual,
  (select top 1 convert(datetime, cast(a2.data as varchar(10))+' '+a2.hora)
   from fc12500 a2
   where a2.nrrqu = a.nrrqu and
     a2.cdopera = a.cdopera and
     convert(datetime, cast(a2.data as varchar(10))+' '+a2.hora) <
        convert(datetime, cast(a.data as varchar(10))+' '+a.hora)
   order by convert(datetime, cast(a2.data as varchar(10))+' '+a2.hora) desc) datahoraanterior
from
  fc12500 a
inner join
  fc12540 b on b.cdetapa = a.cdetapa
where
  a.nrrqu = 6650 and
  a.cdopera = 1
order by
  a.data, a.hora



e, para calcular o tempo decorrido entre elas, pode ser assim (pode ter algum erro de sintaxe, mas a idéia geral é essa):
select
  t.*,
  convert(time, t.datahoraatual - t.datahoraanterior, 8) intervalo
from (
select
  a.cdfil, a.nrrqu, a.serier, a.cdetapa, b.descricao,
  convert(datetime, cast(a.data as varchar(10))+' '+a.hora) datahoraatual,
  (select top 1 convert(datetime, cast(a2.data as varchar(10))+' '+a2.hora)
   from fc12500 a2
   where a2.nrrqu = a.nrrqu and
     a2.cdopera = a.cdopera and
     convert(datetime, cast(a2.data as varchar(10))+' '+a2.hora) <
        convert(datetime, cast(a.data as varchar(10))+' '+a.hora)
   order by convert(datetime, cast(a2.data as varchar(10))+' '+a2.hora) desc) datahoraanterior
from
  fc12500 a
inner join
  fc12540 b on b.cdetapa = a.cdetapa
where
  a.nrrqu = 6650 and
  a.cdopera = 1
) t
order by
  t.data, t.hora



deu esse erro nessa consulta

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 4, column 16.
t.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

25/05/2018

qual a versão do firebird?
GOSTEI 0
Reginaldo Souza

Reginaldo Souza

25/05/2018

qual a versão do firebird?


2.5
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

25/05/2018

select
  t.*,
  datediff(second, t.datahoraanterior, t.datahoraatual) dif_segundos
from (
select
  a.cdfil, a.nrrqu, a.serier, a.cdetapa, b.descricao,
  cast(cast(a.data as varchar(10))||' '||a.hora as timestamp) datahoraatual,
  (select first 1 cast(cast(a2.data as varchar(10))||' '||a2.hora as timestamp)
   from fc12500 a2
   where a2.nrrqu = a.nrrqu and
     a2.cdopera = a.cdopera and
     cast(cast(a2.data as varchar(10))||' '||a2.hora as timestamp) <
        cast(cast(a.data as varchar(10))||' '||a.hora as timestamp)
   order by cast(cast(a2.data as varchar(10))||' '||a2.hora as timestamp) desc) datahoraanterior
from
  fc12500 a
inner join
  fc12540 b on b.cdetapa = a.cdetapa
where
  a.nrrqu = 6650 and
  a.cdopera = 1
) t
order by
  t.datahoraatual
GOSTEI 2
Reginaldo Souza

Reginaldo Souza

25/05/2018

MUITO OBRIGADO !!! deu certo !!
select
  t.*,
  datediff(second, t.datahoraanterior, t.datahoraatual) dif_segundos
from (
select
  a.cdfil, a.nrrqu, a.serier, a.cdetapa, b.descricao,
  cast(cast(a.data as varchar(10))||' '||a.hora as timestamp) datahoraatual,
  (select first 1 cast(cast(a2.data as varchar(10))||' '||a2.hora as timestamp)
   from fc12500 a2
   where a2.nrrqu = a.nrrqu and
     a2.cdopera = a.cdopera and
     cast(cast(a2.data as varchar(10))||' '||a2.hora as timestamp) <
        cast(cast(a.data as varchar(10))||' '||a.hora as timestamp)
   order by cast(cast(a2.data as varchar(10))||' '||a2.hora as timestamp) desc) datahoraanterior
from
  fc12500 a
inner join
  fc12540 b on b.cdetapa = a.cdetapa
where
  a.nrrqu = 6650 and
  a.cdopera = 1
) t
order by
  t.datahoraatual
GOSTEI 0
POSTAR