Consulta SQL em Base Access
04/12/2003
0
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
Posts
04/12/2003
Luineumann
05/12/2003
Mprocha
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
05/12/2003
Mprocha
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
05/12/2003
Adilsond
´ AND A.DATAHORA < ´ + FormatDateTime(´MM/DD/YYYY´, DataFinal.Date + 1) +
´ AND A.CLIENTE >= ´ + cbListaCliIni.Text +
´ AND A.CLIENTE <= ´ + cbListaCliFim.Text;
06/12/2003
Maicongabriel
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!?
06/12/2003
Adilsond
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.
Clique aqui para fazer login e interagir na Comunidade :)