我想用下面的这段查询SQL对应时间和对应LP_TYPE.TYP_DESC里面字段的一组数据的平均值,但是我加上Edit1.Text+'=LP_TYPE.TYP_DESC 后程序不能运行,麻烦看看procedure TFrmMain.SpeedButton2Click(Sender: TObject);
var
  StartDate,
  EndDate:string;
  SQLStr:string;begin
  StartDate := DateToStr(DateTimePicker1.Date)+' 00:00:00';
  EndDate := DateToStr(DateTimePicker2.Date)+' 23:59:59';
SQLStr :='SELECT CONVERT(VARCHAR(30), VPE.DATUMUHRZEIT,111) AS DATE, LP_TYPE.TYP_DESC as type,AVG(LP_DATA.lichtstrom) AS AVG_LUMEN '+
         ' FROM LP_DATA INNER JOIN VPE ON LP_DATA.ID_VPE=VPE.ID_VPE '+
         ' INNER JOIN LP_TYPE ON LP_DATA.ID_TYP=LP_TYPE.ID_TYP '+
         ' WHERE VPE.DATUMUHRZEIT BETWEEN '+QuotedStr(StartDate)+
        ' and '+ QuotedStr(EndDate)  + ' and '+ QuotedStr(EndDate) +Edit1.Text+'=LP_TYPE.TYP_DESC,'+
         ' CONVERT(VARCHAR(30),VPE.DATUMUHRZEIT,111)';  ADODataSet1.Active := False;
  ADODataSet1.CommandText := SQLStr;
  ADODataSet1.Active := True;
end;

解决方案 »

  1.   

    应该sql组合的有问题,你在窗口上加个Memo,然后将程式修改成如下,复制出SQL放到工具里面执行下,看下提示什么错。procedure TFrmMain.SpeedButton2Click(Sender: TObject);
    var
      StartDate,
      EndDate:string;
      SQLStr:string;begin
      StartDate := DateToStr(DateTimePicker1.Date)+' 00:00:00';
      EndDate := DateToStr(DateTimePicker2.Date)+' 23:59:59';
    SQLStr :='SELECT CONVERT(VARCHAR(30), VPE.DATUMUHRZEIT,111) AS DATE, LP_TYPE.TYP_DESC as type,AVG(LP_DATA.lichtstrom) AS AVG_LUMEN '+
             ' FROM LP_DATA INNER JOIN VPE ON LP_DATA.ID_VPE=VPE.ID_VPE '+
             ' INNER JOIN LP_TYPE ON LP_DATA.ID_TYP=LP_TYPE.ID_TYP '+
             ' WHERE VPE.DATUMUHRZEIT BETWEEN '+QuotedStr(StartDate)+
            ' and '+ QuotedStr(EndDate)  + ' and '+ QuotedStr(EndDate) +Edit1.Text+'=LP_TYPE.TYP_DESC,'+
             ' CONVERT(VARCHAR(30),VPE.DATUMUHRZEIT,111)';  Memo1.Lines.Add(SQLStr);
      ADODataSet1.Active := False;
      ADODataSet1.CommandText := SQLStr;
      ADODataSet1.Active := True;
    end;
      

  2.   

    先看下生成的SQL语句是否正确,在SQLStr赋值后加上一句:
    showmessage(SQLStr);
    看下最终的SQL语句哪里错了。
      

  3.   

    把memo里的SQL复制出来放到访问数据库工具里面执行下啊,分下SQL的错误。
      

  4.   

    看了下你输出的sql脚本, 应该执行不了吧, 看着sql语法有问题.建议你把想要实现的查询语句在查询分析器里调试好了, 然后对照着写你编程语言中的sql串.
      

  5.   

       我在SQL里面运行了,报这个错,麻烦帮忙看看。谢谢
      

  6.   

    '...23:59:59'AND 这里有错,AND前后要有空格,后面A59809C00HM是字符串,应有引号,变成:'A59809C00HM',TYP_DESC后不能有“,”换成空格,后面分组语句前应加上:Group by Convert(....)
      

  7.   

    少了空格,And是關鍵詞
    AND A598...
      

  8.   

    procedure TFrmMain.SpeedButton2Click(Sender: TObject);
    var
      StartDate,
      EndDate:string;
      SQLStr:string;begin
      StartDate := DateToStr(DateTimePicker1.Date)+' 00:00:00';
      EndDate := DateToStr(DateTimePicker2.Date)+' 23:59:59';
    SQLStr :='SELECT CONVERT(VARCHAR(30), VPE.DATUMUHRZEIT,111) AS DATE, LP_TYPE.TYP_DESC as type,AVG(LP_DATA.lichtstrom) AS AVG_LUMEN '+
             ' FROM LP_DATA INNER JOIN VPE ON LP_DATA.ID_VPE=VPE.ID_VPE '+
             ' INNER JOIN LP_TYPE ON LP_DATA.ID_TYP=LP_TYPE.ID_TYP '+
             ' WHERE VPE.DATUMUHRZEIT BETWEEN '+QuotedStr(StartDate)+
            ' and '+ QuotedStr(EndDate)  + ' and '+ QuotedStr(EndDate) +''''+Edit1.Text+'''=LP_TYPE.TYP_DESC'  ADODataSet1.Active := False;
      ADODataSet1.CommandText := SQLStr;
      ADODataSet1.Active := True;
    end;
      

  9.   

    EDIT1.TEXT,这里没有加QuotedStr或''进行转义。还有LP_TYPE.TYP_DESC,'+
             ' CONVERT(VARCHAR(30),VPE.DATUMUHRZEIT,111)
    ';
    这段代码什么意思啊?不知道你要做什么功能,SQL语法错误。
      

  10.   

    我添加了空格, 但是还是不行。
    有message 导出的语句看'A59809C00HM 少一半冒号。 不知这要怎么纠正?
    Memo1
    SELECT CONVERT(VARCHAR(30), VPE.DATUMUHRZEIT,111) AS DATE, LP_TYPE.TYP_DESC as type,AVG(LP_DATA.lichtstrom) AS AVG_LUMEN  FROM LP_DATA INNER JOIN VPE ON LP_DATA.ID_VPE=VPE.ID_VPE  INNER JOIN LP_TYPE ON LP_DATA.ID_TYP=LP_TYPE.ID_TYP  WHERE VPE.DATUMUHRZEIT BETWEEN '2013/1/1 00:00:00' and '2013/1/1 23:59:59''A59809C00HM=LP_TYPE.TYP_DESC