Tente assim : Query1.SQL.Clear;
Query1.SQL.Text := 'SELECT Nome,Empresa,FoneRes,FoneCom,Mala FROM Contatos WHERE Data between :pInicial and :pFinal ORDER BY Nome';
Query1.ParamByName('pInicial').Value := DateTimePicker1.Date;
Query1.ParamByName('pFinal').Value := DateTimePicker2.Date;
Query1.Open; esses ":" é para definir que você esta usando ali um parametro que sera mostrado mais abaixo, e não o que esta escrito é o nome do campo em si. Voce esta convertendo uma data em string, e depois voltando a string para data, mas porque ? Tenta fazer direto para ver. Abraços