当我尝试根据日期进行筛选时,运算符不适用于此操作数
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 敞开心扉。请改用参数化查询。
您的代码有几个缺陷:
- 您正在混合一些符号。
- 您在
LIKE
句后漏了一个 space
- 您正在使用没有有效格式的
FormatDateTime
函数来获取日期的月份或年份。
- 你终于不用参数了
试试这个示例(您必须将 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;
我是 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 敞开心扉。请改用参数化查询。
您的代码有几个缺陷:
- 您正在混合一些符号。
- 您在
LIKE
句后漏了一个 space - 您正在使用没有有效格式的
FormatDateTime
函数来获取日期的月份或年份。 - 你终于不用参数了
试试这个示例(您必须将 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;