AND papf.start_date >= to_date(substr(p_date, 1, 6) || ’01’, ’YYYY-MM-DD’) – 1
 AND papf.start_date <= last_day(to_date(p_date, 'YYYY-MM-DD')) + 1; 这两行代码有什么问题啊?挂到ebs上的时候显示——原因:由于 ORA-01847: 月份中日的值必须介于 1 和当月最后一日之间,papf 是基表per_all_people_f,用这条语句判断员工的是否在本月入职。请高人指点啊!

解决方案 »

  1.   

    估计是p_date里面出现了诸如“20110133”这样的没法转成日期的字符串,查下呗
      

  2.   

    p_date 是需要输入的一个日期 ,我是按照这样的格式输入的'YYYY-MM-DD'
      

  3.   

    to_date(substr(p_date, 1, 6) || ’01’, ’YYYY-MM-DD’)这句话,你传入的,比如说p_date是‘2012-07-27’,那么substr(p_date, 1, 6)结果应该为‘2012-0’
    这样子再 || ’01’,结果应该是‘2012-001’当然不符合转换为日期型的格式了。
    改动:AND papf.start_date >= to_date(substr(p_date, 1, 7) || ’01’, ’YYYY-MM-DD’) – 1
    AND papf.start_date <= last_day(to_date(p_date, 'YYYY-MM-DD')) + 1;
      

  4.   

    可是我试了一下这个查询:
    select substr(per.start_date, 1, 7) start_date from per_all_people_f per;
    显示的结果是这样的:1996120,1987010,1995010等这样的,我看了一下start_date的格式是这样的:1996-12-4,1987-1-1,1995-1-1(select start_date from per_all_people_f per;)这些,这该怎么理解呢?谢谢您!
      

  5.   

    还有我查询了一下这个:select substr('1999-12-12',1,7)  from dual;
    这个的显示结果是正确的:1999-12,我是这样理解的,是不是substr函数里面的第一个参数必须是date型才能转换成想要的date型?可以这样理解吗?
      

  6.   

    先用这个函数查下有哪些不是日期格式的create or replace function isdate(parmin in varchar2)
           RETURN NUMBER
     IS
     val DATE;
     BEGIN
     val := TO_DATE (NVL (parmin, 'a'), 'yyyy-mm-dd hh24:mi:ss');
     RETURN 1;
     EXCEPTION
    WHEN OTHERS
     THEN
    RETURN 0;
    end isdate;select * from per where isdate(start_date)=0
      

  7.   

    我看了一下都是日期格式:
    START_DATE  DATE