Intervalo de Datas - SqlServer 2000

17/05/2008

1

Saudações Dephianas!!!!

Estou à frente de um problema duro de se resolver. Eu tenho uma tabela com um campo DATA, no formato varchar. Qdo o usuário insere um registro, esta data é gravada no formato 00/00/0000. Ao pesquisar registros utilizando um intervalo de datas, ele está analisando apenas os 2 primeiros caracteres que representa o dia, se eu digitar um intervalo entre 01/05/2008 e 31/05/2008, se existir uma data 02/03/2008, ele mostra. Não sei mais o que fazer, já pesquisei em vários lugares, e não obtive a solução. Fico anciosamente no aguardo, ah, estou usando o sqlserver 2000 e delphi 2005.

[]s


Responder

Posts

tente assim:
select
  *
from
  sua_tabela
where
  convert(datetime, campo_data, 103) between :datainical and :datafinal



Responder

17/05/2008

Roger1976

emerson, eu tinha colocado desta forma:

with ClientDataSet1 do
begin
close;
commandtext := ´ select * from TESTE ´ +
´ where convert(datetime, DATA_NASC, 103) between ´ +
FormatDateTime(´DD/MM/YYYY´, StrToDate(Edit1.Text)) + ´ and ´ + FormatDateTime(´DD/MM/YYYY´, StrToDate(Edit2.Text));
open;
end;

kra, simplesmente não traz informação alguma. e o problema é q o campo DATA já foi criado como varchar(250) (não foi eu quem criou) e contém informações.

Tá difícil, já usei cast, não funcionou, estou ficando sem opções.

Obrigado pela força, caso tenha alguma outra idéia, será muito bem-vinda.

[]s


Responder
não use datas como strings concatenadas. assim você precisará saber como está definido o formato de datas no SGBDR.
passe as datas como parâmetros para o dataset. assim o mecanismo (driver) do banco de dados se encarrega de enviar a data na formatação correta.
tente assim:
with ClientDataSet1 do
begin
  close;
  commandtext :=
    ´select * from TESTE ´ +
    ´where convert(datetime, rtrim(ltrim(DATA_NASC)), 103) ´+
    ´ between :DataInicial and :DataFinal ´;
  params.parambyname(´datainicial´).asqltimestamp :=
    datetimetosqltimestamp(StrToDate(Edit1.Text));
  params.parambyname(´datafinal´).asqltimestamp :=
    datetimetosqltimestamp(StrToDate(Edit2.Text));
  open;
end;

para usar a função DateTimeToSQLTimeStamp é necessário adicionar a unit SqlTimSt na cláusula uses.


Responder

17/05/2008

Roger1976

emerson, muito obrigado, agora funcionou, só fiz uma pequena alteração, que deu na mesma:

with ClientDataSet1 do
begin
close;
commandtext := ´ select * from TESTE where convert(datetime, DATA_NASC, 103) between :data1 and :data2´;
Params.parambyname(´data1´).value := FormatDateTime(´DD/MM/YYYY´, StrToDate(Edit1.Text));
Params.parambyname(´data2´).value := FormatDateTime(´DD/MM/YYYY´, StrToDate(Edit2.Text));
open;
end;

Valeu mesmo!

[]s


Responder
tire esse FormatDateTime daí...


Responder