Ajuda com consulta SQL, timesstamp

17/03/2020

0

Boa tarde, estou tendo um problema em uma consulta SQL e gostaria de saber se algum pode me ajudar.

O Banco de dados usado é o Firbird 2.5.

Meu problema consiste em uma condição do where onde faço um cast entre dois campos da minha tabela DATA e HORA.

Resumindo, eu tenha duas tabelas com os mesmo campos, onde preciso somar os valores das formas de pagamento de ambas.

Porém por estar usado cast com timesstamp no campo data e hora a consulta não está retornando os dados com precisão.

Se eu passo uma venda não fiscal e consulto com o select, o mesmo me retorno essa primeira venda, porém se eu passo uma segunda venda
"fiscal" e consulto novamente, o select só me retorna o primeiro resultado, o valor só ajusta depois que válido mais uma venda em qualquer uma das tabelas,
acredito que o problema esteja nos campos datas onde uso o cast com timesstamp.

select
    tipo,
    sum(subtotal) total
from (
    select
        sum(c.total_cupom) as subtotal,
        c.tp_pgto as tipo
    from
            TRANS_CF C
    where
        C.id_empresa=:empresa
        and C.sequencia > 705000
        and C.sequencia < 706000
        and C.condicao <> 'C'
        and C.tp_pgto <> '  '
     and cast(c.data||' '||c.hora as timestamp)>=:DATAI
     and cast(c.data||' '||c.hora as timestamp)<=:DATAF
       and c.id_caixa =:caixa
    group by
        tipo
    UNION
    select
        sum(pv.total_cupom) as subtotal,
        pv.tp_pgto as tipo
    from
             trans_PV PV
    where
        PV.id_empresa=:empresa
        and PV.sequencia > 705000
        and PV.sequencia < 706000
        and PV.condicao <> 'C'
        and pv.tp_pgto <> '  '
        and cast(pv.data||' '||pv.hora as timestamp)>=:DATAI
        and cast(pv.data||' '||pv.hora as timestamp)<=:DATAF
        and pv.id_caixa =:caixa
    group by
        tipo
)
group by
tipo
Bruno Divino

Bruno Divino

Responder

Posts

17/03/2020

Emerson Nascimento

como você está passando os valores para a query?
Responder

17/03/2020

Bruno Divino

como você está passando os valores para a query?


Fala Emerson beleza!

Então no sistema está sendo passado dessa forma.

  qry_total_cf_pv.Close;
  qry_total_cf_pv.Params.ParamByName('empresa').AsInteger := FRMPDV.empresa;
  qry_total_cf_pv.Params.ParamByName('caixa').AsInteger := DM_.CAIXA;
  qry_total_cf_pv.Params.ParamByName('DATAI').AsDateTime :=
      StrToDatetime(dataI);
  qry_total_cf_pv.Params.ParamByName('DATAF').AsDateTime := Now;
  qry_total_cf_pv.Open;


Sendo que a variável dataI está recebendo o seguinte valor.

  DM_NOVO_.QRY_.Close;
  DM_NOVO_.QRY_.SQL.Text := sql_dados_;
  DM_NOVO_.QRY_.ParamByName('empr').AsInteger := StrToInt(frmLogin.empresa);
  DM_NOVO_.QRY_.ParamByName('caixa').AsInteger := StrToInt(frmLogin.CAIXA);
  DM_NOVO_.QRY_.Open;
  lb_data_.Caption := DateToStr(DM_NOVO_.QRY_.FieldByName('data_abertura')
      .AsDateTime) + '  ' + TimeToStr(DM_NOVO_.QRY_.FieldByName('hora_abertura')
      .AsDateTime);
  lb_caixa_.Caption := frmLogin.CAIXA;
  DTI := DM_NOVO_.QRY_.FieldByName('DATA_ABERTURA').Value;
  HORA := DM_NOVO_.QRY_.FieldByName('hora_ABERTURA').Value;
  dataI := DateToStr(DTI) + ' ' + TimeToStr(HORA);


select "sql_dados"

  sql_dados_ = select * from abertura
where condicao = 'A' 
and id_empresa =:empr 
and id_caixa =:caixa 


Grande problema é que, rodando o select do título do tópico direto no banco de dados o mesmo não trás as informações precisas.
Responder

17/03/2020

Emerson Nascimento

certo. vamos por partes:
- quais os tipos dos campos DATA e HORA
- como está gravado o conteúdo dos campos?


Responder

18/03/2020

Bruno Divino

certo. vamos por partes:
- quais os tipos dos campos DATA e HORA
- como está gravado o conteúdo dos campos?




Emerson, na base os campos DATA está como date e HORA está como Time.

Sendo gravados dessa forma exemplo, campo DATA = '17/03/2020 ' e HORA '09:12:53'.

Acho que o problema é nesse cast que concateno os dois campos, tentei usar a função DATEDIFF porém não achei um exemplo que me fizesse entender o processo.

Responder

18/03/2020

Emerson Nascimento

vamos lá....
primeiramente, se há trabalho com horas, é necessário cuidado com o parâmetro passado. por exemplo:
SELECT
    CAST(data || ' ' || HORA AS TIMESTAMP)
FROM
    CAD_OS
WHERE
    CAST(data || ' ' || HORA AS TIMESTAMP) BETWEEN CAST('06.10.2017' AS TIMESTAMP) AND CAST('26.10.2017' AS TIMESTAMP)
ORDER BY
    data, HORA
a query acima não listará nenhum registro do dia 26/10/2017, porque eu não estou passando qualquer horário para o parâmetro.
serão listados os registros de 06/10/2017 desde a zero hora, até a zero hora de 26/10/2017.

a query abaixo lista os registros corretamente, porque foi passada a hora limite:
SELECT
    CAST(data || ' ' || HORA AS TIMESTAMP)
FROM
    CAD_OS
WHERE
    CAST(data || ' ' || HORA AS TIMESTAMP) BETWEEN CAST('06.10.2017' AS TIMESTAMP) AND CAST('26.10.2017 23:59' AS TIMESTAMP)
ORDER BY
    data, HORA
serão listados os registros de 06/10/2017 desde a zero hora, até a meia noite de 26/10/2017. eu também poderia ter passado somente o dia 27/10/2017, sem informar a hora.

uma coisa que faço ao passar parâmetros datetime no Delphi: no lugar de .AsDateTime utilizo .AsSQLTimeStamp

Responder

18/03/2020

Bruno Divino

Emerson, na consulta ao banco de dados passo os parâmetros dessa forma.

https://ibb.co/9s42mgZ

Isso é um exemplo da consulta que faço direto no banco.

Já no fonte eu vou testar com AsSQLTimeStamp.

Responder

19/03/2020

Emerson Nascimento

Testei da forma que você apresentou na imagem. Fiz com >= e <= e também com BETWEEN (que eu prefiro).
SELECT
    CAST(data || ' ' || HORA AS TIMESTAMP)
FROM
    CAD_OS
WHERE
    CAST(data || ' ' || HORA AS TIMESTAMP) BETWEEN :datai AND :dataf
ORDER BY
    data, HORA
e
SELECT
    CAST(data || ' ' || HORA AS TIMESTAMP)
FROM
    CAD_OS
WHERE
    CAST(data || ' ' || HORA AS TIMESTAMP) >= :datai
    AND CAST(data || ' ' || HORA AS TIMESTAMP) <= :dataf
ORDER BY
    data, HORA
Funcionou das duas formas

Tem certeza que há dados que atendem aos parâmetros passados?

Responder

19/03/2020

Bruno Divino

Bom dia Emerson.

Sim tenho certeza, porém notei uma coisa hoje.

Na máquina da minha empresa, rodamos o windows na plataforma 7 utimate, lá foi onde detectei o problema, já o meu SGBD é o firebird 2012, nesses dois cenários o problema ocorre.

Estou fazendo testes no meu note com windows 10 e uma versão trial do firebird 2015, aqui roda normalmente, inclusive com pequeno intervalo de minutos ou segundos.

Da parte do sistema eu até compreendi depois de pesquisar, parece que há diferenças na formatação da data ou pode haver de sistema operacional para sistema operacional, agora não entendi não rodar no firebird 2012.

Acredito que identificado esse problema, devo padronizar os campos data e hora no sistema para rodar em outras plataformas certo?

Basta apenas formatar a data e hora?

Infelizmente só irei conseguir testar na máquina da empresa depois.
Responder

19/03/2020

Bruno Divino

Bom dia Emerson.

Sim tenho certeza, porém notei uma coisa hoje.

Na máquina da minha empresa, rodamos o windows na plataforma 7 utimate, lá foi onde detectei o problema, já o meu SGBD é o ibxpert 2012, nesses dois cenários o problema ocorre.

Estou fazendo testes no meu note com windows 10 e uma versão trial do ibxpert 2015, aqui roda normalmente, inclusive com pequeno intervalo de minutos ou segundos.

Da parte do sistema eu até compreendi depois de pesquisar, parece que há diferenças na formatação da data ou pode haver de sistema operacional para sistema operacional, agora não entendi não rodar no ibxpert 2012.

Acredito que identificado esse problema, devo padronizar os campos data e hora no sistema para rodar em outras plataformas certo?

Basta apenas formatar a data e hora?

Infelizmente só irei conseguir testar na máquina da empresa depois.


Correção, ibexpert
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar