Consulta SQL em Base Access

Delphi

04/12/2003

Estou tentando fazer uma consulta sobre uma base Access, por um campo do tipo DateTime, e o que acontece é que o resultado não vem como deveria, se por exemplo eu seleciono uma data entre o dia 01/12/2003 e 04/12/2003, ele me trás somente os registros do dia 01/12/2003 até o dia 03/12/2003 !

Meu SQL:

strSQL := strSQL + ´ WHERE A.DATAHORA >= ´ + FormatDateTime(´#MM/DD/YYYY´, DataInicial.Date) +
´ AND A.DATAHORA <= ´ + FormatDateTime(´MM/DD/YYYY´, DataFinal.Date) +
´ AND A.CLIENTE >= ´ + cbListaCliIni.Text +
´ AND A.CLIENTE <= ´ + cbListaCliFim.Text;

Eu jogo este SQL na propriedade CommandText de um ClientDataSet.
Os ´´ servem para ignorar a Hora, já que o campo possui data e hora. exemplo: 04/12/2003 16:01:30
Estou utilizando Delphi 7 e os componentes da palheta ADO.

Alguem tem uma ideia ?


Maicongabriel

Maicongabriel

Curtidas 0

Respostas

Luineumann

Luineumann

04/12/2003

como a sinteaxe parece correta, vc não estaria esquecendo do = no <= datafinal?


GOSTEI 0
Mprocha

Mprocha

04/12/2003

brother, vc já tentou assim:
strSQL := strSQL + ´ WHERE Format(A.DATAHORA, ´dd/mm/yyyy´) >= ´ + FormatDateTime(´#MM/DD/YYYY´, DataInicial.Date) +
´ AND format(A.DATAHORA, ´dd/mm/yyyy´) <= ´ + FormatDateTime(´MM/DD/YYYY´, DataFinal.Date) +
´ AND A.CLIENTE >= ´ + cbListaCliIni.Text +
´ AND A.CLIENTE <= ´ + cbListaCliFim.Text;

eu utilizei a função FORMAT do Visual Basic dentro da query (a parte string da query)

vê se funciona ae, Ok

[]s

Marcos Rocha


GOSTEI 0
Mprocha

Mprocha

04/12/2003

Outra dica se caso não funcione a anterior, tente usar parametros do tipo Date ...

na propriedade SQL:
select * from TABELA
where CAMPODATA between :p_DtI and :p_DtF

na propriedate Params configure a p_DtI e p_DtF para:
DataType = ftDate
ParamType = ptInput

e no código da aplicação faça assim:

//se for acesso via ADO
...
begin
Query1.Close;
Query1.Params.ParamByName(´p_DtI´).AsString := mskDt_I.Text;
Query1.Params.ParamByName(´p_DtF´).AsString := mskDt_F.Text;
Query1.Open;
end;

obs: e vc pode tambem incluir em tempo de execução dinamicamente o comando SQL e os parametros na query Ok.

[]s

Marcos Rocha


GOSTEI 0
Adilsond

Adilsond

04/12/2003

strSQL := strSQL + ´ WHERE A.DATAHORA >= ´ + FormatDateTime(´#MM/DD/YYYY´, DataInicial.Date) +
´ AND A.DATAHORA < ´ + FormatDateTime(´MM/DD/YYYY´, DataFinal.Date + 1) +
´ AND A.CLIENTE >= ´ + cbListaCliIni.Text +
´ AND A.CLIENTE <= ´ + cbListaCliFim.Text;


GOSTEI 0
Maicongabriel

Maicongabriel

04/12/2003

strSQL := strSQL + ´ WHERE A.DATAHORA >= ´ + FormatDateTime(´#MM/DD/YYYY´, DataInicial.Date) + ´ AND A.DATAHORA < ´ + FormatDateTime(´MM/DD/YYYY´, DataFinal.Date + 1) + ´ AND A.CLIENTE >= ´ + cbListaCliIni.Text + ´ AND A.CLIENTE <= ´ + cbListaCliFim.Text;


Esta ultima funcionou AdilsonD! mas é uma bela injanbração não acha? É isso o que eu queria evitar, ou pelomenos saber o pq disto, visto que entre outras bases o esquema que utilizei funciona corretamente.

Supozição :: Não seria talvez pelas horas que estão jundo do campo, talvez pelo numero de horas da data do dia 03 serem maiores do que as do dia 04, algo deste tipo!?


GOSTEI 0
Adilsond

Adilsond

04/12/2003

Veja bem, um campo DateTime que possua o valor:

01/01/2003 00:00:00 é menor que 01/01/2003 00:00:01

ou seja, a hora está influenciando em sua consulta. Voce poderia fazer de duas maneiras para resolver o problema.

1ª - Somar 1 na data final e mudar de <= para <, ou seja, ele vai buscar todos os registros até a hora 23:59:59 da data do parametro final.

2ª - Converter a data do banco na hora da consulta para trazer apenas a data com hora 00:00:00, que no seu caso como é o access utilizando a função CDate(data,formato)

O que fiz não foi uma injanbração, foi um artifício para resolver o problema, o qual utilio e muito, pois se por exemplo sua base contiver um índice pelo campo data e voce utilizar a segunda opção, o banco jamais utilizara o índice para a pesquisa, fazendo um full scan em sua base. Enquanto utilizando a primeira opção ele utilizará o índice, sendo muito mais rápida a consulta.


GOSTEI 0
POSTAR