当我尝试根据日期进行筛选时,运算符不适用于此操作数

Operator not applicable to this operand when I try to make filter based on date

我是 Delphi 和查询的新手,在我发布这个问题之前,我搜索了所有与我的问题相关的地方,但似乎我找不到任何可以帮助我解决问题的东西。

我发现此错误消息表明运算符不适用于此操作数类型,代码如下:

SQL.Text:='SELECT COUNT(Nik) FROM Absent WHERE Nik LIKE' 
  +QuotedStr('%'+cxButtonEdit1.Text+'%') 'AND MONTH(Tgl)'= 
  +QuotedStr(FormatDateTime('yyyy-mm-dd',dtp1.Date)')+ 'AND YEAR(Tgl)'= 
  +QuotedStr(FormatDateTime('yyyy-mm-dd',dtp1.Date));

如何解决这个错误?

您缺少 + 运算符,并且混淆了一些引号。而不是:

SQL.Text:='SELECT COUNT(Nik) FROM Absent WHERE Nik LIKE' 
  +QuotedStr('%'+cxButtonEdit1.Text+'%') 'AND MONTH(Tgl)'= 
  +QuotedStr(FormatDateTime('yyyy-mm-dd',dtp1.Date)')+ 'AND YEAR(Tgl)'= 
  +QuotedStr(FormatDateTime('yyyy-mm-dd',dtp1.Date));

我猜你是说

SQL.Text:='SELECT COUNT(Nik) FROM Absent WHERE Nik LIKE' 
  +QuotedStr('%'+cxButtonEdit1.Text+'%') +' AND MONTH(Tgl)='
  +QuotedStr(FormatDateTime('yyyy-mm-dd',dtp1.Date))+ ' AND YEAR(Tgl)=' 
  +QuotedStr(FormatDateTime('yyyy-mm-dd',dtp1.Date));

另请注意,您必须停止以这种方式构建查询。您正在向 SQL injection attacks 敞开心扉。请改用参数化查询。

您的代码有几个缺陷:

  1. 您正在混合一些符号。
  2. 您在 LIKE 句后漏了一个 space
  3. 您正在使用没有有效格式的 FormatDateTime 函数来获取日期的月份或年份。
  4. 你终于不用参数了

试试这个示例(您必须将 ADOQuery1 替换为真正的查询组件名称)

  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT COUNT(Nik) FROM Absent WHERE Nik LIKE :Nik');
  ADOQuery1.SQL.Add('AND MONTH(Tgl) = :MonthTgl');
  ADOQuery1.SQL.Add('AND YEAR(Tgl) = :YearTgl');

  ADOQuery1.Parameters.ParamByName('Nik').Value      :=  '%'+cxButtonEdit1.Text+'%';
  ADOQuery1.Parameters.ParamByName('MonthTgl').Value := MonthOf(dtp1.Date);
  ADOQuery1.Parameters.ParamByName('YearTgl').Value  := YearOf(dtp1.Date);

  ADOQuery1.Open;