procedure Tfmtime.BitBtn1Click(Sender: TObject);
var
  sqlStr:string;
  ListItem: TListItem;
  i,j:Integer;
  dz_sg:Boolean;
begin
  if ((trim(edtYear.Text) = '') or (trim(edtMonth.Text) = '')or (trim(edtday.Text) = '')or
      (trim(edtYear2.Text) = '') or (trim(edtMonth2.Text) = '')or (trim(edtday2.Text) = '')) then
  begin
    ShowMessage('请输入查询年月!');
    exit;
  end;
  lvGr.Items.Clear;
  sqlStr := 'select id,mzh,name,yblb,fzkb,doc_code,doc_name,doc_dept,doc_result  from inpatient_info'
            +' where fzrq <'
            +quotedstr(trim(edtday.Text) +'-'+ trim(edtmonth.Text) +'月' +'-'+trim(edtyear.Text))
            +' and '
            +' fzrq >='
            +quotedstr(trim(edtday2.Text) +'-'+trim(edtmonth2.Text) +'月'+'-'+trim(edtyear2.Text));    qryDg1.Close;
    qrydg1.sql.clear;
    qryDg1.SQL.add(sqlStr);
    qryDg1.Open;
    qryDg1.First;
    for i := 0 to qryDg1.RecordCount -1  do
    begin
      ListItem:=lvGr.Items.Add;
      ListItem.Caption:= Trim(qryDg1.FieldByName('id').AsString);
      ListItem.SubItems.Add(Trim(qryDg1.FieldByName('mzh').AsString));
      ListItem.SubItems.Add(Trim(qryDg1.FieldByName('name').AsString));
      ListItem.SubItems.Add(Trim(qryDg1.FieldByName('yblb').AsString));
      ListItem.SubItems.Add(Trim(qryDg1.FieldByName('fzkb').AsString));
      ListItem.SubItems.Add(Trim(qryDg1.FieldByName('doc_code').AsString));
      ListItem.SubItems.Add(Trim(qryDg1.FieldByName('doc_name').AsString));
      ListItem.SubItems.Add(Trim(qryDg1.FieldByName('doc_dept').AsString));
      ListItem.SubItems.Add(Trim(qryDg1.FieldByName('doc_result').AsString));
      next;
    end;    //qryTTemp1
end;报错:ORA01861:文字与格式字符串不匹配。就是说我SQL语句格式错了。但是
debug 的时候 取出sqlstr串里面的sql语句:select id,mzh,name,yblb,fzkb,doc_code,doc_name,doc_dept,doc_result  from inpatient_info where  fzrq <'2-2月-2013' and  fzrq >='2-2月-2013'  放到查询分析器里面运行 没问题求大神了~

解决方案 »

  1.   

    最可怕的是 我单独把这个语句串 SQLSTR 提出来,新建了一个工程单独运行 就特么没问题???这是为什么 莫非老夫眼花了?
      

  2.   

    我把这条sqlstr 语句缩短了 没有后面where检索 也可以运行!
      

  3.   

    问题没看出来,给个建议,也许有用把日期先用一个变量date_=trim(edtday.Text) +'-'+ trim(edtmonth.Text) +'月' +'-'+trim(edtyear.Text)存起来,
    再quotedstr(date_);
      

  4.   

    俺眼神也不好,米看出差别。
    断点看看拼接后的这个sqlStr的值
      

  5.   


    谁能加俺QQ :150276543我断点调试 把SQL语句放到 sqlplus里面运行 好好的……
      

  6.   

    可能是oracle字符集问题,换to_date('2013-01','yyyy-mm')试试看。
      

  7.   

    数据库连接有nls的参数,也许你这个连接不认这个格式,可以确认的是当前连接的回话中日期格式肯定不是这个。 所以,简单的做法,或者说严谨的做法有两个:
    1)要么用上to_char
    2)要么在连接中设置nls_date_format
      

  8.   


    举例
    procedure Tfrm_server.btn2Click(Sender: TObject);
    begin
      con1.Close;
      //con1.Params.Add('nls_date_format=''yyyymmdd''');
      con1.Open;
      sqlqry2.Close;
      sqlqry2.SQLConnection:=con1;
      sqlqry2.SQL.Text:='begin execute immediate ''alter '+
                  ' session set nls_date_format=''''yyyymmdd''''''; end;';
      sqlqry2.ExecSQL;end;procedure Tfrm_server.btn3Click(Sender: TObject);
    begin
      sqlqry1.Close;
      sqlqry1.SQL.Clear;
      sqlqry1.SQL.Add('select * from txgfx_dm_xg where sysdate>''20130101''');
      sqlqry1.Open;
      ds2.Active:=true;
    end;结果是可以的。
      

  9.   


    举例
    procedure Tfrm_server.btn2Click(Sender: TObject);
    begin
      con1.Close;
      //con1.Params.Add('nls_date_format=''yyyymmdd''');
      con1.Open;
      sqlqry2.Close;
      sqlqry2.SQLConnection:=con1;
      sqlqry2.SQL.Text:='begin execute immediate ''alter '+
                  ' session set nls_date_format=''''yyyymmdd''''''; end;';
      sqlqry2.ExecSQL;end;procedure Tfrm_server.btn3Click(Sender: TObject);
    begin
      sqlqry1.Close;
      sqlqry1.SQL.Clear;
      sqlqry1.SQL.Add('select * from txgfx_dm_xg where sysdate>''20130101''');
      sqlqry1.Open;
      ds2.Active:=true;
    end;结果是可以的。嗯,我后来就是把日期格式化了以后就可以了!