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

时间:2018-06-12 14:14:36

标签: sql-server delphi firedac

我正在Delphi 10.2.3 Tokyo使用FireDac并设置与SqlServer(2016)数据库的连接,当我在查询中设置过滤器Date_Document字段时,我得到“无法解析SQL timesamp字符串”异常。

BTW: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;

1 个答案:

答案 0 :(得分:1)

在这种情况下我会使用escape sequences。例如(假设 DATE_DOCUMENT 列是您提到的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&#39;仅使用指定格式的给定日期时间替换日期部分。

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