Ajuda com consulta SQL, timesstamp
17/03/2020
0
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
Posts
17/03/2020
Bruno Divino
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.
17/03/2020
Emerson Nascimento
- quais os tipos dos campos DATA e HORA
- como está gravado o conteúdo dos campos?
18/03/2020
Bruno Divino
- 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.
18/03/2020
Emerson Nascimento
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
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
uma coisa que faço ao passar parâmetros datetime no Delphi: no lugar de .AsDateTime utilizo .AsSQLTimeStamp
18/03/2020
Bruno Divino
https://ibb.co/9s42mgZ
Isso é um exemplo da consulta que faço direto no banco.
Já no fonte eu vou testar com AsSQLTimeStamp.
19/03/2020
Emerson Nascimento
SELECT CAST(data || ' ' || HORA AS TIMESTAMP) FROM CAD_OS WHERE CAST(data || ' ' || HORA AS TIMESTAMP) BETWEEN :datai AND :dataf ORDER BY data, HORA
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
Tem certeza que há dados que atendem aos parâmetros passados?
19/03/2020
Bruno Divino
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.
19/03/2020
Bruno Divino
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
Clique aqui para fazer login e interagir na Comunidade :)