Ajuda com consulta SQL, timesstamp
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.
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
Curtidas 0
Respostas
Emerson Nascimento
17/03/2020
como você está passando os valores para a query?
GOSTEI 0
Bruno Divino
17/03/2020
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.
GOSTEI 0
Emerson Nascimento
17/03/2020
certo. vamos por partes:
- quais os tipos dos campos DATA e HORA
- como está gravado o conteúdo dos campos?
- quais os tipos dos campos DATA e HORA
- como está gravado o conteúdo dos campos?
GOSTEI 0
Bruno Divino
17/03/2020
certo. vamos por partes:
- quais os tipos dos campos DATA e HORA
- como está gravado o conteúdo dos campos?
- 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.
GOSTEI 0
Emerson Nascimento
17/03/2020
vamos lá....
primeiramente, se há trabalho com horas, é necessário cuidado com o parâmetro passado. por exemplo:
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:
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
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
GOSTEI 0
Bruno Divino
17/03/2020
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.
https://ibb.co/9s42mgZ
Isso é um exemplo da consulta que faço direto no banco.
Já no fonte eu vou testar com AsSQLTimeStamp.
GOSTEI 0
Emerson Nascimento
17/03/2020
Testei da forma que você apresentou na imagem. Fiz com >= e <= e também com BETWEEN (que eu prefiro).
e
Funcionou das duas formas
Tem certeza que há dados que atendem aos parâmetros passados?
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?
GOSTEI 0
Bruno Divino
17/03/2020
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.
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.
GOSTEI 0
Bruno Divino
17/03/2020
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.
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
GOSTEI 0