Ir para conteúdo
Fórum Script Brasil
  • 0

Timestamp Em Sql (queries)


paulobergo

Pergunta

Oi pessoal...

Tenho uma tabela para armazenar roteiros de viagens.

Alterei alguns campos na tentativa de obter outros calculados, diretamente nas queries que consultam os dados gravados...

No exemplo a seguir, é criada uma tabela (básica) e, o que se pretende conseguir, é o tempo, em dias e horas, através da comparação da data+hora de um campo com outro...


Query 1. Criando a tabela (Visual dBase7, pelo DBExplorer).

create table 'viagens.dbf'
(
sequencial      autoinc,
roteiro         char(10),
saidalocal      char(20),
saidadatahora   timestamp,
chegadalocal    char(20),
chegadadatahora timestamp,
empresa char(20)
)

Query 2. Inserindo dados, saída de Juiz de Fora, Chegada a Belo Horizonte.

insert into 'viagens.dbf'
(
roteiro,
saidalocal,
saidadatahora,
chegadalocal,
chegadadatahora,
empresa
)
values
(
'JDFFOR01',
'JDF TERM ROD.','11/22/2006 10:00:00',
'BHZ TERM ROD.','11/22/2006 16:30:00',
'Atual'
)

Query 3. Inserindo dados, saída de Belo Horizonte, Chegada a Salvador.

insert into 'viagens.dbf'
(
roteiro,
saidalocal,
saidadatahora,
chegadalocal,
chegadadatahora,
empresa
)
values
(
'JDFFOR01',
'BH CFZ','11/22/2006 23:40:00',
'SALVADOR SSA','11/23/2006 00:10:00',
'Gol'
)

Query 4. Inserindo dados, saída de Salvador, Chegada a Fortaleza.

insert into 'viagens.dbf'
(
roteiro,
saidalocal,
saidadatahora,
chegadalocal,
chegadadatahora,
empresa
)
values
(
'JDFFOR01',
'SALVADOR SSA ','11/23/2006 10:10:00',
'FORTALEZA FOR','11/23/2006 12:00:00',
'OceanAir'
)

Query 5. Inserindo dados, saída do Aeroporto de Fortaleza, Chegada à Praia de Iracema.

insert into 'viagens.dbf'
(
roteiro,
saidalocal,
saidadatahora,
chegadalocal,
chegadadatahora,
empresa
)
values
(
'JDFFOR01',
'FORTELEZA FOR ','11/23/2006 12:20:00',
'FORTALEZA PRAIA IRACEMA','11/23/2006 12:50:00',
'mototaxi'
)


Query 6. Inserindo dados, saída da areia, Chegada à boca do Tubarão.

insert into 'viagens.dbf'
(
roteiro,
saidalocal,
saidadatahora,
chegadalocal,
chegadadatahora,
empresa
)
values
(
'JDFFOR01',
'FORTELEZA PRAIA AREIA','11/23/2006 12:50:00',
'FORTALEZA MAR TUBARAO','11/23/2006 12:55:00',
'byfoot'
)

Query 7, para ver todos os dados:

select * from 'viagens.dbf'


Query 8, para ver os dados, e tentar calcular o tempo entre uma chegada e a respectiva saída.

select sequencial, roteiro,
       saidalocal, saidadatahora,
       chegadalocal, chegadadatahora,
       (chegadadatahora-saidadatahora) tempo_a,
       Cast(
            Cast('01/01/1980 00:00:00' as date)+
        ((chegadadatahora-saidadatahora)*3600)
        as timestamp
       ) tempo_b,
      
from 'viagens.dbf'

Como se pode observar, é feito um cálculo entre as colunas ... como converter isso para

dd/mm/aaaa hh:mm:ss

Alguma idéia?

Grato!

* Aquele "cast" com 01/01/1980 foi só um chute pra ver no que é que dava!

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0
Como se pode observar, é feito um cálculo entre as colunas ... como converter isso para

dd/mm/aaaa hh:mm:ss

(chegadadatahora-saidadatahora) tempo_a: paulobergo, nunca utilizei Visual dBase7, mas esta coluna na sua query já não resulta num campo timestamp (que tem data e hora) já que ambos os campos envolvidos foram assim definidos?
Link para o comentário
Compartilhar em outros sites

  • 0

Oi.

Infelizmente, a comparação entre dois campos timestamp resulta num valor real.

Por exemplo:

23/11/2006 12:50:00 - 23/11/2006 12:20:00 = 0,020833333333333

Então, como converter isso para 30min?

Grato por qualquer idéia!

há! não uso o Visual Dbase 7... Uso os Delphi 3, 4, 6.

As tabelas contendo timestamp (ou outros tipos especiais de campos, como autoinc) são criadas pelo Delphi no formato do Visual dBase7, se o driver padrão na bde estiver "dBase"...

Já vi algumas serem criadas como dBaseIII+ (tabelas bem simples) e dBaseIV 2.0

Link para o comentário
Compartilhar em outros sites

  • 0
Oi.

Infelizmente, a comparação entre dois campos timestamp resulta num valor real.

Por exemplo:

23/11/2006 12:50:00 - 23/11/2006 12:20:00 = 0,020833333333333

Então, como converter isso para 30min?

Paulo, ocorre que TDateTime/TTime/TDate são do tipo Float. Então, não tem problema. Para formatar o resultado no seu programa, basta utilizar as funções de formatação de data/hora que funciona.

Você pode também criar um campo calculado do tipo TDateTime, define a propriedade DisplayFormat, e no evento OnCalcField, do seu dataset, atribui o valor do campo retornado ao campo calculado.

Eu diria para você tentar fazer um type-cast para TimeStamp na sua consulta - ((chegadadatahora-saidadatahora) as timestamp) tempo_a. Quem sabe consiga modificar o retorno de modo a facilitar as coisas. Pelo que lí neste link, o resultado da subtração de dois timestamp resultam em um decimal(18,9).

Se precisar apresentar total de horas, que possa ultrapassar 24 horas(tipo, 32:00hs), dê uma olhada neste post que fiz em outro forum.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Olá!

Curioso como coisas simples e que a gente faz sempre ficam escondidas em alguma fiapo do cérebro e custam a vir à tona!

Fou só dar uma olhadinha naquele link e ver a soma * 24 para lembrar que no próprio código do programa eu faço a multipiplicação do sobra do valor resultante da função DaySpan por 24 para obter o tempo em horas... então, a query fica assim:

Assim,

select sequencial, roteiro,
       saidalocal, saidadatahora,
       chegadalocal, chegadadatahora,
       chegadadatahora-saidadatahora tempo_float,
       Cast((chegadadatahora-saidadatahora) *24 as integer) horas,
       (((chegadadatahora-saidadatahora) *24 ) -
       (Cast((chegadadatahora-saidadatahora) *24 as integer))) * 60 minutos 
from 'viagens.dbf'

retorna:

.. saidadatahora       chegadadatahora     tempo_float       horas minutos
.. 22/11/2006 10:00:00 22/11/2006 16:30:00 0,270833333333333 6     30
.. 23/11/2006 10:10:00 23/11/2006 12:00:00 0,076388888888889 1     50

Isso me dá o tempo em horas e minutos, diretamente na query... Antes, usava, dentro do programa, algo parecido com isto:
    dSaidaDataHora := FieldByName('SaidaDataHora').AsDateTime;
    dChegadaDataHora := FieldByName('ChegadaDataHora').AsDateTime;
    vDias    := DaySpan(dChegadaDataHora,dSaidaDataHora);
    iDias    := Trunc(vDias);
    vTempo   := (vDias-iDias);
    vHoras   := vTempo*24;
    iHoras   := Trunc(vHoras);
    vMinutos := ((vHoras-iHoras)*60);
    iMinutos := Trunc(vMinutos);

    // iHoras := HoursBetween(dChegadaDataHora,dSaidaDataHora);
    // iMinutos := MinutesBetween(dChegadaDataHora,dSaidaDataHora);
    ShowMessage('Dias   = '+IntToStr(iDias )+cr+
                'Horas  = '+IntToStr(iHoras)+cr+
                'Minutos= '+IntToStr(iMinutos)
               );

Valeu pela Ajuda!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...