Fórum Ajuda com consulta SQL, timesstamp #608671
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
Curtir tópico
+ 0Posts
17/03/2020
Emerson Nascimento
Gostei + 0
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.
Gostei + 0
17/03/2020
Emerson Nascimento
- quais os tipos dos campos DATA e HORA
- como está gravado o conteúdo dos campos?
Gostei + 0
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.
Gostei + 0
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, HORAserã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
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.
Gostei + 0
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, HORASELECT
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, HORATem certeza que há dados que atendem aos parâmetros passados?
Gostei + 0
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.
Gostei + 0
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)