Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia,
tenho uma base dbf onde tenho um campo de data em formato string(character 10).
Estava tentando fazer uma busca entre datas usando esse campo da seguinte forma:
Query1.Sql.Add('select * from cadmov where Data Between :dt1 and :dt2 and TT = :tt');
Quando faço :
Query1.Sql.Add('select * from cadmov where Data = :dt1' and TT = :tt');
, funciona porque ele pega literalmente a string do campo e faz a busca.
Consegui uma resposta parcial usando :
'from cadmov where (cast(Data as date) between :dt1 and :dt2) and TT = :tt');
Numa busca por exemplo do dia 01/03/2011 a 31/03/2011 ele me retorna
registros com data de 03/02/2011(fevereiro), ai que ta o problema.
Agradeço qualquer ajuda,
Alexandre Torres
Obrigado pela resposta.
Um amigo pediu pra fazer assim :
sql.add('select *from receita WHERE datainicial between #'+formatdatetime('yyyy-mm-dd',DateTimePicker1.Date)+'# AND #'+formatdatetime('yyyy-mm-dd',DateTimePicker2.date)+'# order by datainicial');
mas dessa forma recebo esse erro : exception message : Invalid use of keyword. Token: #2011-03-01# Line Number: 1.
Já tentei mudar o formato para yyyy/mm/dd, tentei tambem mm/dd/yyyy, mas nada deu jeito.
Agradeco a ajuda.
Alexandre Torres
sem as barras não funciona?
sql.add('select *from receita WHERE datainicial between #'+formatdatetime('yyyymmdd', DateTimePicker1.Date)+'# AND #'+formatdatetime('yyyymmdd', DateTimePicker2.date)+'# order by datainicial');
Continua o mesmo erro.
você consegue postar o código para criação da tabela (a DDL da tabela)?
Bom, vou postar aqui o código da rotina e logo abaixo como esta o banco, frisando que esse banco não fui eu quem criou, estou simplesmente pegando um banco que ja roda em um cliente e desenvolvendo um programinha para ajuda-los.
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Total : Real;
begin
Query1.Close;
Query1.SQL.Clear;
Query1.Sql.Add('select TT, data, VALES, NUMVALE, VALE, ORDEM, DESCONTO '+
// 'from cadmov where (cast(Data as date) between :dt1 and :dt2) and TT = :tt');'AND #'+formatdatetime('yyyymmdd',DateTimePicker2.date)+'# AND TT = :tt order by data');
//Query1.ParamByName('dt1').asDate := JvDateEdit1.Date;
//Query1.ParamByName('dt2').AsDate := JvDateEdit2.date;
Query1.ParamByName('tt').AsInteger := Strtoint(Edit1.Text);
Query1.Open;
Total := 0;
Query1.First;
while (not Query1.Eof) do begin
Total:= Total + Query1Total.Value;
Query1.Next;
end;
label4.Caption := FloatToStr(Total);
end;
Estrutura do banco
DATA CHARACTER 10
TT NUMERIC 3
VALES NUMERIC 8,2
NUMVALE NUMERIC 8
VALE NUMERIC 8,2
ORDEM NUMERIC 6
DESCONTO NUMERIC 3
Desde já agradeço sua paciência em me ajudar.
Alexandre Torres
Seu problema parece estar relacionado a forma como o cast tá funcionado. acredito que o cast que você está fazendo está colocando a data no padrão americano MMDDAAAA.