select y.ASSET_ID from ASSET_PRODUCT_REPAIRINF y 
where months_between(sysdate,add_months(to_date(y.repair_sdate,'yyyy-mm-dd'),3))<1
 
字段y.repair_sdate在数据库中为字符型
 如上代码,当我要把y.repair_sdate转化为date时,由于数据库中有些数据存在空值,所以编译的时候出错:“输入值对于日期长度不够长。   这段代码的本意是,我要将系统当前时间sysdate,减去,开始保修时间”y.repair_sdate“与保修期(假设为3)的和。
我要求出的是差值小于1的所有数据,也就是还差一个月就要过保修期的数据。
  但是因为有些数据的开始保修时间y.repair_sdate为空,所以用上面的方面编译不能通过
  我想请高手给我一些建议,谢谢!
  

解决方案 »

  1.   

       保修时间y.repair_sdate为空的情况下sql执行应该是没有问题的,只是把所有repair_sdate为空的记录排除在检索结果外;当然你可以在查询时用 nvl(x,y)方法来给repair_sdate一个默认值,如 nvl(y.repair_sdate,'2007-01-01'),不过个人认为业务需求上没有这个必要。
      

  2.   

    各位请注意一点,保修时间y.repair_sdate 在数据库中的字段是varchar(10)型
    所以当我用to_date(nvl2(y.repair_sdate,y.repair_sdate,'1900-01-01')时,会弹出输入值对于日期长度不够长,
    今天为了这个问题,我已经弄了一整天了,郁闷死了,寻求高手来帮助解决。
    另外,二楼,你说的没错,但你忽略了 保修时间y.repair_sdate 在数据库中的字段是varchar(10)型。在转换为date型的时候,是无法用to_date转换的。
    也就是说,只要数据库中存在一个空值,就会出错的。
      

  3.   

    郁闷了。为什么
    select to_date(nvl(y.repair_sdate,'1900-01-01'),'yyyy-mm-dd') from ASSET_PRODUCT_REPAIRINF y 
    没有什么问题
    而把select to_date(nvl(y.repair_sdate,'1900-01-01'),'yyyy-mm-dd') from ASSET_PRODUCT_REPAIRINF y 
    嵌入months_between,充当它的一个参数时,就显示错误了呢?
       跪求高手帮助
      

  4.   

    不该有错,贴month_between代码出来看
      

  5.   

    varchar(10)型 为什么不能用to_date转换?即使为空,也照样可以执行;当然有个前提:varchar(10)的字符样式样跟to_date里的样式参数匹配。