Jump to content
Fórum Script Brasil
  • 0
Sign in to follow this  
Tatiane.InterArt

(Resolvido) Pesquisa por período de Data funcionava e não funcion

Question

Tinha uma pesquisa por período de data, onde minha data é String q funcionava certinho e agora está furada! alguém saberia me dizer o q pode ter acontecido? Tudo o q fiz foi mudar um campo da tabela de String para Inteiro, refiz toda a programação e realmente não está funcionando:

Detalhando melhor: Trabalho com Delphi7 e InterBase6

Tabela antiga:

PagtoContaPG

Código - Varchar

Data - Varchar

Valor - Varchar

Tipo - Varchar

Nova Tabela:

PagtoContaPG

Código - Integer

Data - Varchar

Valor - Varchar

Tipo - Varchar

Minha pesquisa é feita através de um botão pesquisar em um form q capta os valores através de 2 MaskEdits

o código está assim:

IBQuery1.Close;

IBQuery1.SQL.Clear;

IBQuery1.SQL.Add('Select * from PagtoContaPG where Data Between '''+MaskEdit1.Text+''' and '''+MaskEdit2.Text+'''');

IBQuery1.Open;

Antes de mudar meu banco ele filtrava certinho tipo se precisasse trazer datas do dia 01/02/08 a 10/02/08 aparecia no relatório o período certo, ordenado por data e tudo!

Agora se fizer a mesma pesquisa, ele me traz todas as datas q iniciam com 01 02 03 04 05 06 07 08 09 e 10, tipo vai traz não só 01/02/08, 02/02/08, 03/02/08... e sim 01/02/08, 01/03/08, 01/05/08 e todos os outros meses q tiver dia 01...

Tentei de tudo e nada funciona, tentei até mesmo declarar a variável no banco como Date, mas mesmo mudando o formato da Data no micro para DD/MM/YY ela salva invertida MM/DD/YY q fica inviável para mim, alguém saberia me ajudar neste caso?

Share this post


Link to post
Share on other sites

14 answers to this question

Recommended Posts

  • 0
Antes de mudar meu banco ele filtrava certinho tipo se precisasse trazer datas do dia 01/02/08 a 10/02/08 aparecia no relatório o período certo, ordenado por data e tudo!

Agora se fizer a mesma pesquisa, ele me traz todas as datas q iniciam com 01 02 03 04 05 06 07 08 09 e 10, tipo vai traz não só 01/02/08, 02/02/08, 03/02/08... e sim 01/02/08, 01/03/08, 01/05/08 e todos os outros meses q tiver dia 01...

Tentei de tudo e nada funciona, tentei até mesmo declarar a variável no banco como Date, mas mesmo mudando o formato da Data no micro para DD/MM/YY ela salva invertida MM/DD/YY q fica inviável para mim, alguém saberia me ajudar neste caso?

Tatiane.InterArt, não me canso em sugerir que não seja utilizada a concatenação em strings SQL, mas sim que se faça uso de parâmetros, justamente porque esta questão de datas é muito problemática. Siga a sugestão deste post - tem uma breve explicação lá.

Abraços

Share this post


Link to post
Share on other sites
  • 0

Ahnn sim, na verdade apenas simplifiquei, mas estava usando dessa forma, na verdade, estou fazendo um teste agora com a variável declarada como Date no banco e usando o DateTimePicker, só estou em dúvida em como ficaria meu insert na tela de inclusão usando esse componente, afinal nunca usei só sei q para manipulá-lo uso a DateTimePicker.Date, mas no insert se passar dessa forma dá incompatibilidade de TDate para String, se jogo em uma variável tipo string, quando clico no botão salvar dá erro de incompatibilidade de String para TDate, você teria algum exemplo do Insert para me passar assim poderia ver no q estou pecando!

Mas valeu o toque!

Share this post


Link to post
Share on other sites
  • 0
mas no insert se passar dessa forma dá incompatibilidade de TDate para String, se jogo em uma variável tipo string, quando clico no botão salvar dá erro de incompatibilidade de String para TDate, você teria algum exemplo do Insert para me passar assim poderia ver no q estou pecando!
Bom, agora você explicou melhor a situação, seu problema está mais associado ao insert...

Inclusive, percebi que me concentrei no problema errado. :blush:

Voce definiu seu campo Data como sendo varchar e não Date - e está utilizando uma instrução (between) que, ao meu entender, não vai funcionar corretamente mesmo. Há algum motivo especial pelo qual você não possa definir o campo como Date nas suas tabelas?

Se houver, talvez seja o caso de você, então, fazer a conversão deste campo para um date de modo a usar a SQL corretamente. Algo como:

Select * 
from PagtoContaPG 
where cast(Data as date) Between :d1 and :d2

e passando os parâmetros como exemplifiquei antes. Mas, a melhor opção seria realmente trabalhar com campos DATE no banco.

Abraços

Share this post


Link to post
Share on other sites
  • 0

Não Micheus você me deu a dica se concentrando no problema certo, e como disse já estava fazendo a pesquisa exatamente assim, por parâmetro e mesmo assim não estava funcionando, não sei porque, afinal antes funcionava direitinho!

Por isso, resolvi fazer um TESTE, montei outra tabela com a data declarada como TimesTamp afinal trabalho com o dialect3, assim a pesquisa até parece mais fácil e sem a complicação q tem-se com datas e períodos, porém fiquei com outro problema, q é no momento de inserir algo nesta tabela, pois dá erro de compatibilidade, se jogo essa data como string dá erro de

IBQuery1:Type mismatch field 'DATA', expecting: DateTime actual: String

se jogo gomo TDate direto pelo DateTimePicker dá erro de

IBQuery1:Type mismatch field 'DATA', expecting: String actual: DateTime

o q fazer? arrumo a pesquisa e pioro o resto rsrsrsrsrsrs!

Share this post


Link to post
Share on other sites
  • 0

Pessoal, resolvido o problema, em questão de estar fazendo um teste esqueci de mudar o nome da tabela em questão, por isso estava dando esses erros, do mais valeu a ajuda Micheus! foi muito proveitosa creia-me!

Share this post


Link to post
Share on other sites
  • 0
em questão de estar fazendo um teste esqueci de mudar o nome da tabela em questão, por isso estava dando esses erros
ai, ai, ai... ^_^

(...) montei outra tabela com a data declarada como TimesTamp afinal trabalho com o dialect3, (...)
Tatiane.InterArt, apenas a título de comentário, caso você não precise armazenar a hora junto à data, seria mais conveniente utilizar o tipo DATE já que este é um campo de 32bits (ocupa 4 Bytes de espaço), enquanto que o TIMESTAMP é um campo de 64bits (ocupa 8 Bytes). No caso do uso de dialect 1, o tipo DATE equivale ao TIMESTAMP o que não faria qualquer diferença.

Abraços

Share this post


Link to post
Share on other sites
  • 0

Retornando o problema:

pois bem montei a tela de pesquisa com dois DateTimePicker, mudei o format deles para dd/MM/yyyy apenas pra ficar mais bonitinho de se ver, e montei meu botão pesquisar usando parâmetros pras datas como já haviam me dado a dica antes então ficou assim:

IBQuery1.Close;

IBQuery1.SQL.Clear;

IBQuery1.SQL.Add('select * from PagtoConta where Data Between :inicio and :fim');

IBQuery1.Parambyname('inicio').AsDateTime:=DateTimePicker1.Date;

IBQuery1.Parambyname('fim').AsDateTime:=DateTimePicker2.Date;

IBQuery1.Open;

Agora vem o pequeno problema, no banco de dados a data acaba ficando no formato M/D/YYYY mesmo usando o DateTimePicker na tela de inclusão, quando salvo na tabela automaticamente acontece isso, então aí está o problema, quando faço a pesquisa ele interpreta a data como sendo DD/MM/YY no visual, no valor do DateTimePicker como D/M/YYYY e no banco M/D/YYYY, imaginem o q acontece quando realizo a pesquisa... logicamente pensando acontece assim:

Datas do Banco

4/1/2008 q seria dia 1 mês 4 ano 2008 e assim por diante

4/2/2008

4/4/2008

4/5/2008

5/1/2008

6/1/2008

7/1/2008

as datas informadas à pesquisa:

:Inicio 01/04/08 visualmente e no valor do DateTimePicker 1/4/2008

:Fim 10/04/08 visualmente e no valor do DateTimePicker 10/4/2008

o q ele traz na minha pesquisa? - somente o 4/4/2008 do banco

se inverto o formatdateTime para M/D/YYYY

acontece assim:

:Inicio 01/04/08 invertido mês 1 dia 4 ano 2008

:Fim 10/04/08 invertido mês 10 dia 4 ano 2008

o que ele traz pra minha pesquisa? Tudo

se crio variáveis para separar dia mes ano e remontar a data no formato

ele não filtra absolutamente nada!

então o q me dizem?

Share this post


Link to post
Share on other sites
  • 0

Tatiane.InterArt, por conta disto acho melhor nivelarmos a situação atual:

- que banco de dados você está utilizando? INTERBASE :blush:

- o campo Data é mesmo VARCHAR no banco ou você está usando o tipo DATE/TIMESTAMP?

- voce está gravando esta data de que modo: apenas a data ou data e hora?

Retornando o problema:

pois bem montei a tela de pesquisa com dois DateTimePicker, mudei o format deles para dd/MM/yyyy apenas pra ficar mais bonitinho de se ver, e montei meu botão pesquisar usando parâmetros pras datas como já haviam me dado a dica antes então ficou assim:

IBQuery1.Close;

IBQuery1.SQL.Clear;

IBQuery1.SQL.Add('select * from PagtoConta where Data Between :inicio and :fim');

IBQuery1.Parambyname('inicio').AsDateTime:=DateTimePicker1.Date;

IBQuery1.Parambyname('fim').AsDateTime:=DateTimePicker2.Date;

IBQuery1.Open;

Agora vem o pequeno problema, no banco de dados a data acaba ficando no formato M/D/YYYY mesmo usando o DateTimePicker na tela de inclusão, quando salvo na tabela automaticamente acontece isso, então aí está o problema, quando faço a pesquisa ele interpreta a data como sendo DD/MM/YY no visual, no valor do DateTimePicker como D/M/YYYY e no banco M/D/YYYY, imaginem o q acontece quando realizo a pesquisa... logicamente pensando acontece assim:

Isto não faz sentido, porque supondo que seu campo no banco seja DATE, ao passar o parâmetro como datetime/date você não teria qualquer problema com relação a formatação (não tem como - é um número referente a data). Entretanto, se seu campo for VARCHAR no banco, seus parâmetros sendo string e você atribuir um valor a eles via médoto AsDateTime, neste caso haverá uma conversão do tipo de dados da data do tipo numérico para o tipo string e, aí sim, será realizada uma formatação do string.

Abraços

Edited by Micheus

Share this post


Link to post
Share on other sites
  • 0

O campo no banco é mesmo tipo Date-TimesTamp, e até tentei passar a pesquisa como varchar pra ver se é isso, mas quando faço a pesquisa assim:

IBQuery1.Close;

IBQuery1.SQL.Clear;

IBQuery1.SQL.Add('select * from PagtoConta where Cast(Data asDate) Between :inicio and :fim');

IBQuery1.Parambyname('inicio').AsString:=FormatDateTime('D/M/YYYY',DateTimePicker1.Date);

IBQuery1.Parambyname('fim').AsString:=FormatDateTime('D/M/YYYY',DateTimePicker2.Date);

IBQuery1.Open;

tentando forçar que o formato dos parâmetros fiquem iguais os das datas q estão no banco acontece q somente me aparece a data:

M/D/YYYY

4/4/2008

as demais

4/1/2008

4/2/2008

4/5/2008 q deveriam aparecer não aparecem!

Share this post


Link to post
Share on other sites
  • 0
(...) onde minha data é String q funcionava certinho e agora está furada! alguém saberia me dizer o q pode ter acontecido? Tudo o q fiz foi mudar um campo da tabela de String para Inteiro,

(...)

Tabela antiga:

PagtoContaPG

Código - Varchar

Data - Varchar

Valor - Varchar

Tipo - Varchar

Nova Tabela:

PagtoContaPG

Código - Integer

Data - Varchar

Valor - Varchar

Tipo - Varchar

Tatiane.InterArt, neste seu post inicial, vemos que na estrutura de sua tabela o campo Data é VARCHAR.

Agora, neste último post, aparentemente você mudou o tipo do campo:

O campo no banco é mesmo tipo Date-TimesTamp, (...)

Já está ficando meio confuso tudo isto. Vamos dar uma repassada...

IBQuery1.SQL.Add('select * from PagtoConta where Cast(Data as Date) Between :inicio and :fim');

IBQuery1.Parambyname('inicio').AsString:=FormatDateTime('D/M/YYYY',DateTimePicker1.Date);

IBQuery1.Parambyname('fim').AsString:=FormatDateTime('D/M/YYYY',DateTimePicker2.Date);

o uso do CAST como sugeri, não se aplicaria a esta situação. Seria apenas no caso de o campo Data ser um varchar e você passar os parâmetros como sendo datetime (AsDateTime).

Tem que tentar não misturar as alternativas porque senão, nunca vai se chegar a lugar algum:

1) Se o campo Data é do tipo DATE/TIMESTAMP, então a codificação tem que ser:

IBQuery1.SQL.Add('select * from PagtoConta where Data Between :inicio and :fim');

IBQuery1.Parambyname('inicio').AsDateTime := DateTimePicker1.Date;

IBQuery1.Parambyname('fim').AsDateTime := DateTimePicker2.Date;

e não importa o formato "visual" da data, porque numericamente (TDate/TDatetime são double) corresponderá ao número que representa a data em questão;

2) Se o campo Data é do tipo VARCHAR, então, para passar o parâmetro você deveria utilizar o método AsString. Contudo, neste caso em que este campo varchar representa uma data e você quer retornar um período, não dá para tratá-lo como string, porque o resultado ficará muito errado. Assim, faz-se o uso do CAST para tratar seu campo Data como um tipo Date e passa-se os parâmetros com este formato:

IBQuery1.SQL.Add('select * from PagtoConta where CAST(Data AS DATE) Between :inicio and :fim');

IBQuery1.Parambyname('inicio').AsDateTime := DateTimePicker1.Date;

IBQuery1.Parambyname('fim').AsDateTime := DateTimePicker2.Date;

Ainda levando em conta que a data no formato texto esteja armazenada com M/D/YYYY, porque do contrário, uma data como 15/1/2008 resultará em erro (não existe um mês 15).

Veja um exemplo do que quero dizer. Em uma tabela tenho o campo ORDER_DATE_STR VARCHAR(10), com os dados armazenados no formato M/D/YYYY. Fazendo a consulta com o CAST e AsDateTime o resultado é:

ORDER_DATE    ORDER_DATE_STR
01/08/1993    8/1/1993
09/08/1993    8/9/1993
09/08/1993    8/9/1993
16/08/1993    8/16/1993
Que é o resultado esperado. já se não usar o CAST e usar o AsString o resultado é:
ORDER_DATE    ORDER_DATE_STR
15/10/1992    10/15/1992
15/10/1992    10/15/1992
10/10/1993    10/10/1993
27/10/1993    10/27/1993
27/10/1993    10/27/1993
:                 :
04/01/1994    1/4/1994
06/01/1994    1/6/1994
17/01/1994    1/17/1994

Muitissimo errado!!!

Então, dê uma olhada com carinho em como está o campo em seu banco de dados e tente utilizar a opção mais apropriada, porque os códigos postados foram se misturando e não atendem corretamente a situação.

Abraços

Share this post


Link to post
Share on other sites
  • 0

Micheus neste primeiro post apenas me confundi colocando a nova tabela também como Varchar, mas na verdade ela era varchar e recriei como Date - TimesTamp, o que quis dizer sobre o ultimo post foi apenas q tentei fazer a pesquisa de várias formas inclusive passando os parâmetros como String, recaptulando:

Minha Tabela Atual:

PagtoContaPG

Código - Integer

Data - TimesTamp

Valor - Varchar

Tipo - Varchar

tentei todos os tipos de pesquisa possíveis e até os impossíveis como até mensionei no ultimo post, tentei até passar os parâmetros como String e nenhuma delas consigo chegar no resultado esperado! esse é o maior problema!

Desculpe-me não a falta de clareza nos posts anteriores, mas é q a gente sempre imagina q as pessoas tem a mesma linha de raciocínio q a gente e realmente não notei o erro do primeiro post!

Share this post


Link to post
Share on other sites
  • 0
tentei todos os tipos de pesquisa possíveis e até os impossíveis como até mensionei no ultimo post, tentei até passar os parâmetros como String e nenhuma delas consigo chegar no resultado esperado! esse é o maior problema!

Tatiane.InterArt, baixe este exemplo, descompacte em uma pasta qualquer e teste aí.

Eu criei a tabela PagtoContaPG no Firebird (que é o que tenho), populei com os dados iniciais que você passou, utilizei os componentes IB e a consulta do seu post#8...

e o resultado foi...

exatamente o esperado. Tudo certo.

Abraços

Project_Tatiane.zip

Share this post


Link to post
Share on other sites
  • 0

Confesso que tive que mudar um pouquinho o a pesquisa, no fim das contas ao invés do between tive que usar <= >= para funcionar direitinho, ainda não compreendo por que o between não funcionou de forma alguma!

dei uma olhada neste seu exemplo e mesmo usando as linhas idênticas não funciona, deve ser mesmo algo com meu banco ou o delphi vai entender...

Share this post


Link to post
Share on other sites
  • 0
Confesso que tive que mudar um pouquinho o a pesquisa, no fim das contas ao invés do between tive que usar <= >= para funcionar direitinho, ainda não compreendo por que o between não funcionou de forma alguma!
Tatiane.InterArt, você guarda a hora junto à data neste campo. Se sim, esta é a explicação, por no filtro você passa apenas a data (ao menos pelos exemplos que apareceram)

dei uma olhada neste seu exemplo e mesmo usando as linhas idênticas não funciona, deve ser mesmo algo com meu banco ou o delphi vai entender...
a idéia é que você usasse ele. Eu o preparei para ler os dados do arquivo no diretório do programa compilado.

Assim, teríamos 99,9% de certeza de que deve ser algo com sua versão do Banco, já que aqui funciona perfeitamente.

Abraços

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  



  • Forum Statistics

    • Total Topics
      148582
    • Total Posts
      644298
×
×
  • Create New...