Fórum Calculo de tempo médio SQL #594453

25/05/2018

0

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

Responder

Post mais votado

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

Emerson Nascimento

Emerson Nascimento
Responder

Gostei + 2

Mais Posts

25/05/2018

Reginaldo Souza

vou testar aqui e ja posto o resultado. vamos ver
Responder

Gostei + 0

25/05/2018

Reginaldo Souza

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.
Responder

Gostei + 0

25/05/2018

Emerson Nascimento

qual a versão do firebird?
Responder

Gostei + 0

25/05/2018

Reginaldo Souza

qual a versão do firebird?


2.5
Responder

Gostei + 0

28/05/2018

Emerson Nascimento

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
Responder

Gostei + 2

29/05/2018

Reginaldo Souza

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
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar