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

时间:2015-03-12 15:41:02

标签: delphi delphi-7

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

我发现此错误消息,该操作符不适用于此操作数类型:

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));

如何解决此错误?

2 个答案:

答案 0 :(得分:4)

您的代码有几个缺陷:

  1. 你正在混合一些符号。
  2. LIKE句后
  3. 错过了一个空格
  4. 您使用FormatDateTime函数时没有有效格式来获取日期的月份或年份。
  5. 最后你没有使用参数。
  6. 尝试此示例(您必须替换真实查询组件名称的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;
    

答案 1 :(得分:0)

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

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。改为使用参数化查询。