当我使用 FireDac 过滤我的 sqlServer 数据库时出现 EConvertError

EConvertError when I Filter my sqlServer database with FireDac

我将 Delphi 10.2.3 TokyoFireDac 一起使用,并设置与 SqlServer(2016) 数据库的连接,当我在查询中设置过滤器 Date_Document 字段时,我得到"could not parse SQL timesamp string"异常。

顺便说一句:Date_Document 的数据类型是 datetime

procedure TfrmMain.fltDateEdt2Change(Sender: TObject);
var dat1,dat2:TSQLTimeStamp;
begin
if (fltDateEdt1.Text<>'  /  /    ') and (fltDateEdt2.Text<>'  /  /    ') then
 begin
 if fltDateEdt1.Date<fltDateEdt2.Date then
  try
   dat1:=DateTimeToSQLTimeStamp(fltDateEdt1.Date);
   dat2:=DateTimeToSQLTimeStamp(fltDateEdt2.Date);
   comps.qryMain.Filter:=format('%s>= %s AND %s<=%s',  ['DATE_DOCUMENT',SQLTimeStampToStr('YYYY-MM-DD',dat1).QuotedString,'DATE_DOCUMENT',SQLTimeStampToStr('YYYY-MM-DD',dat2).QuotedString]);
comps.qryMain.Filtered:=true;
  except

  end;
  end
else
  begin
  comps.qryMain.Filtered:=false;
  comps.qryMain.Filter:='';
  end;
end;

我会使用你提到的 escape sequences in such case. Like for example (assuming that DATE_DOCUMENT column is of DATETIME 数据类型):

comps.qryMain.Filter := Format('DATE_DOCUMENT >= {dt %s 00:00:00} AND DATE_DOCUMENT <= {dt %s 23:59:59}', [
  FormatDateTime('yyyy-mm-dd', fltDateEdt1.Date),
  FormatDateTime('yyyy-mm-dd', fltDateEdt2.Date)
]);

制作这样的过滤器字符串的目的是让 FireDAC 将描述的日期时间格式转换为 DBMS 的本机格式,只需将日期部分替换为指定格式的给定日期时间。

更好的是,我会为 OnFilterRecord 事件编写一个处理程序。