select * from m_sendmaterial where Sysdate>to_date(substr('04020305987',1,6),'YYMMDD') 没有任何错误啊!检查你变量的值的长度阿!

解决方案 »

  1.   

    这试过把substr(paytype,1,6)换成substr('04020305987',1,6)确实是没错,但就是前都报这个01840的错误啊,建表语句中,PAYTYPE                                 VARCHAR2(20)
      

  2.   

    检查是否你的所有输入都满足长度的要求,应该是有些数据不满足长度要求才会出错,
    select min(len(paytype)) from m_sendmaterial group by paytype;
      

  3.   

    只有一条记录,paytype的长度为12
      

  4.   

    select sysdate-to_date(substr('040717192423A',1,6),'yymmdd') from dual没有任何问题.
      

  5.   

    对SQL机制的疑问:
    在表中只有两个字段:area,paytype;现在表中记录如下:
    JSYD    0407
    JSDX    040717162135B
    JSYD
    就会报如题的错误,而把JSYD的记录全删除,就不报错了。
    但我在如下的SQL中是限定的area='JSDX' and 了啊?
    select * from table1 where area='JSDX' and length(paytype)>=6 and  Sysdate>to_date(substr(PAYTYPE,1,6),'YYMMDD');
      

  6.   

    那么在表中存在JSYD,JSDX,JSLT等,而paytype有‘0407’,‘040717162135B‘和空三种情况,我怎么样才能取到属于JSDX的而且paytype是’040717162135B‘样式的记录呢!万分感谢!
      

  7.   

    大概实际执行是Sysdate>to_date(substr(PAYTYPE,1,6),'YYMMDD')在前,看建area的索引试试。
      

  8.   

    另外,好像ORACLE是自下而上的顺序解析WHERE子句,你把Sysdate>to_date(substr(PAYTYPE,1,6),'YYMMDD')放在最前面看。