Consulta SQL em Base Access

04/12/2003

4

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 ?


Responder

Posts

04/12/2003

Luineumann

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


Responder

05/12/2003

Mprocha

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


Responder

05/12/2003

Mprocha

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


Responder

05/12/2003

Adilsond

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;


Responder

06/12/2003

Maicongabriel

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!?


Responder

06/12/2003

Adilsond

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.


Responder