我正在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;
答案 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事件编写处理程序。