目前,在写oracle存储过程,调试如下SQL语句报错:
viDays := to_number(to_date(vtEndDate, 'YYYY-MM-DD') - to_date(vtBegDate, 'YYYY-MM-DD')) + viAddDays;
错误:
ORA-01841: (完整) 年份值必须介于 -4713 和 +9999 之间, 且不为 0查询参数表时:
NLS_DATE_FORMAT参数是'DD-MON-RR' show parameter NLS_DATE_FORMAT
SQL> show parameter NLS_DATE_FORMAT
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_date_format                      string      
 
不知道这是不是NLS_DATE_FORMAT设置的问题,请高手指点?

解决方案 »

  1.   


    --修改会话格式语法为:
    alter session set nls_date_format='yyyy-mm-dd';
    --你这不是会话日期格式的问题,
    --看错误提示:
    --ORA-01841: (完整) 年份值必须介于 -4713 和 +9999 之间, 且不为 0
    --很明显,你将日期加减后得到的结果不在年份值[-4713 , +9999]之间
      

  2.   

    你的入参是什么呢?还是你的nls_date_format 怎么是string 
      

  3.   

    应该是数据有问题,或者时间经过加减之后,超出oracle的时间范围了。
    碰到过这种问题,有一次一个表里边有一条年份超过10000的数据,是前端通过ejb加入的,
    (我自己尝试,用各种加载策略都加不进去,实在不知道web端ejb怎么加到表里边的)
    然后操作这个表的时候,就报同样的错误了。
    年份超出oracle的时间范围了。eg: 
    SQL> select to_date('00000101','yyyymmdd') from dual;
    select to_date('00000101','yyyymmdd') from dual
                   *
    ERROR at line 1:
    ORA-01841: (full) year must be between -4713 and +9999, and not be 0