sqlstr := 'select a.finputdoctorname,c.fypbh,c.fmc,c.fgg,d.fcj,d.fypjxmc,sum(c.fsl) '+
 'from zy.tzydoctororder a '+
 'left join zy.tzynurseorder b '+
 'on a.forderid = b.fadviceid '+
 'left join ypgl.tzyfymx c '+
 'on b.fid=c.fyzid '+
 'left join hisbase.tdrugcode d '+
 'on c.fypbh=d.fmcode '+
 'where c.ffyrq >= to_date(:a1,‘yyyy-mm-dd’) ' +
 'and c.ffyrq<= to_date(:a2,‘yyyy-mm-dd’) '+
 'and c.fypbh in(:a3) '+
 'group by a.finputdoctorname,c.fypbh,c.fmc,c.fgg,d.fcj,d.fypjxmc';
  ADOQuery1.sql.Add(sqlstr);  DateTimePicker1.Date:=now;
  DateTimePicker2.Date:=now;
  ADOQuery1.Parameters.ParamByName('a1').Value := FormatdateTime('yyyy-mm-dd',DateTimePicker1.Date);
  ADOQuery1.Parameters.ParamByName('a2').Value := FormatdateTime('yyyy-mm-dd',DateTimePicker2.Date);
  ADOQuery1.Parameters.ParamByName('a3').Value := edit1.Text;  ADOQuery1.Open; 
请问这段oracle的sql语句怎么拼接,新手一只,调试了3天没有搞好。主要还是日期这个地方很要命!

解决方案 »

  1.   

    'where c.ffyrq >= to_date(:a1,''''yyyy-mm-dd''') '这样试试,你用的是中文的',肯定会报错的
      

  2.   

    'where c.ffyrq >= to_date(:a1,''yyyy-mm-dd'') '
    试试这个,字符串里面的单引号要写成两个。
      

  3.   

    'where c.ffyrq >= to_date(:a1,''yyyy-mm-dd'') '
    试试这个,字符串里面的单引号要写成两个。  
      

  4.   


    调试一下,将SQL语句复制出来,在TOAD或其他程序中运行看看。
    另外,确认一下是否如1楼说的,单引号是要英文的,不能是中文的。
      

  5.   

    还有一点,c.fypbh是什么类型的??如果是字符串,那也可能会出问题。
      

  6.   

    从来都是用float表示时间
      

  7.   

     ADOQuery1.SQL.Clear;
      sqlstr :=  'select * from (  '+
      'select a.finputdoctorname,c.fypbh,c.fmc,c.fgg,d.fcj,d.fypjxmc,sum(c.fsl) total  ' +
      'from zy.tzydoctororder a       '      +
      'left join zy.tzynurseorder b     '    +
        'on a.forderid = b.fadviceid     '   +
      'left join ypgl.tzyfymx c      '    +
      'on b.fid=c.fyzid        '  +
      'left join hisbase.tdrugcode d   '  +
      'on c.fypbh=d.fmcode       '  +
      'where c.ffyrq>=to_date(:a1,'+quotedstr('yyyy-mm-dd')+')   '    +
      'and c.ffyrq<=to_date(:a2,'+quotedstr('yyyy-mm-dd')+') ' +
      'and c.fypbh in(:a3)  '   +
      'union all '    +
      'select  a.finputdoctorname,c.fypbh,c.fmc,c.fgg,d.fcj,d.fypjxmc,sum(c.fsl) total '  +
      'from zy.tcydoctororder a   '        +
      'left join zy.tcynurseorder b   '    +
        'on a.forderid = b.fadviceid    '   +
      'left join ypgl.tzyfymx c    '    +
      'on b.fid=c.fyzid   ' +
      'left join hisbase.tdrugcode d '  +
      'on c.fypbh=d.fmcode   '   +
     ' where c.ffyrq>=to_date(:a1,'+quotedstr('yyyy-mm-dd')+')  '    +
      'and c.ffyrq<=to_date(:a2,'+quotedstr('yyyy-mm-dd')+') '  +
       'and c.fypbh in(:a3)  '   +
       'union all '  +
     'select p.fname,e.fypbh,e.fmc,e.fgg,g.fcj,g.fypjxmc,sum(e.fsl) total from ypgl.tmzfymx e left join hisbase.tdrugcode  g   ' +
     'on e.fypbh=g.fmcode   '  +
     'left join hisbase.tperson p  '  +
     'on e.fysh=p.ftybh  ' +
     'where e.ffyrq>=to_date(:a1,'+quotedstr('yyyy-mm-dd')+')   '     +
     ' and e.ffyrq<=to_date(:a2,'+quotedstr('yyyy-mm-dd')+')  '  +
      ' and e.fypbh in(:a3) '      +
      ') aa  '+
      'order by aa.fypbh,aa.total desc ';ADOQuery1.sql.Add(sqlstr);
      ADOQuery1.Parameters.ParseSQL(ADOQuery1.SQL.Text,true);
      ADOQuery1.Parameters.ParamByName('a3').Value := edit1.Text;
      ADOQuery1.Parameters.ParamByName('a1').Value := FormatdateTime('yyyy-mm-dd',DateTimePicker1.Date);
      ADOQuery1.Parameters.ParamByName('a2').Value := FormatdateTime('yyyy-mm-dd',DateTimePicker2.Date);  ADOQuery1.ParamCheck := False;  ADOQuery1.Open;上面的问题解决了,但是这个用了union all后就报参数未正确定义
      

  8.   

    用meno输出在pl/sql里面都能正常运行
      

  9.   

    别人说group by会出问题我就去掉了,准备在外面使用