Consulta SQL em Base Access
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 ?
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
Curtidas 0
Respostas
Luineumann
04/12/2003
como a sinteaxe parece correta, vc não estaria esquecendo do = no <= datafinal?
GOSTEI 0
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
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
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
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
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;
´ AND A.DATAHORA < ´ + FormatDateTime(´MM/DD/YYYY´, DataFinal.Date + 1) +
´ AND A.CLIENTE >= ´ + cbListaCliIni.Text +
´ AND A.CLIENTE <= ´ + cbListaCliFim.Text;
GOSTEI 0
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
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.
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