使用YY格式如果日期中的年份采用的格式为YY,并且只提供了2位的年份,那么就认为这一年的世纪与数据库服务器上当前设置的世纪相同。因此,指定年份的前两位数字与当前年份的前两位数字相同。例如,如果提供的年份是15,而当年是2007年,那么提供的年份就是2015年。同理,如果提供的年份是75,那么就是2075年。注意:如果日期中的年份使用YYYY格式,但是只提供了2位的年份,那么Oracle数据库就会使用YY格式来解释日期。下面来看一个查询,它在处理年份15和75时使用YY格式。在下面这个查询中,注意向TO_DATE()函数输入的年份是15和75,其输出又被传递给TO_CHAR函数,后者将日期转换为DD-MON-YYYY格式的字符串(此处使用了YYYY格式,这样就可以看到TO_DATE函数返回的4位年份)。 SELECTTO_CHAR(TO_DATE('04-JUL-15', 'DD-MON-YY'), 'DD-MON-YYYY'),TO_CHAR(TO_DATE('04-JUL-75', 'DD-MON-YY'), 'DD-MON-YYYY')FROM dual;TO_CHAR(TO_ TO_CHAR(TO_----------- -----------04-JUL-2015 04-JUL-2075 正如期望的一样,15和75分别被解释为2015年和2075年。使用RR格式 
如果日期中的年份采用的格式为RR,并且只提供了最后2位年份,那么年份中的前两位数字就由两部分共同确定:提供年份的两位数字(指定年),数据库服务器上当前日期中年份的后2位数字(当年)。确定指定年世纪的规则如下:● 规则1 如果指定年在00~49之间,并且当前年份在00~49之间,那么指定年的世纪就与当前年份的世纪相同。因此,指定年的前两位数字就等于当前年份的前两位数字。例如,如果指定年为15,而当前年份为2007,那么指定年就是2015。● 规则2 如果指定年在50~99之间,并且当前年份在00~49之间,那么指定年的世纪就等于当前年份的世纪减去1。因此,指定年的前两位数字等于当前年份的前两位数字减去1。例如,如果指定年为75,而当前年份为2007,那么指定年就是1975。● 规则3 如果指定年在00~49之间,并且当前年份在50~99之间,那么指定年的世纪就等于当前年份的世纪加上1。因此,指定年的前两位数字等于当前年份的前两位数字加上1。例如,如果指定年为15,而当前年份为2075,那么指定年就是2115。● 规则4 如果指定年在50~99之间,并且当前年份在50~99之间,那么指定年的世纪就与当前年份的世纪相同。因此,指定年的前两位数字就等于当前年份的前两位数字。例如,如果指定年为55,而当前年份为2075,那么指定年就是2055。

解决方案 »

  1.   

    查看你使用的是RR格式还是YY格式的
    select * from nls_database_parameters where PARAMETER ='NLS_DATE_FORMAT'
      

  2.   

    试试这个
    INSERT INTO job_history VALUES(
              102 , TO_DATE('13-JAN-93','dd-mm-yyyy'), TO_DATE('24-JUL-98','dd-mm-yyyy'), 'IT_PROG', 60    )
      

  3.   

    自己先去测试下再来回复,唉!
    SQL> select TO_DATE('13-JAN-93','dd-mm-yyyy'),TO_DATE('24-JUL-98','dd-mm-yyyy') from dual;
    select TO_DATE('13-JAN-93','dd-mm-yyyy'),TO_DATE('24-JUL-98','dd-mm-yyyy') from dual
                   *
    第 1 行出现错误:
    ORA-01858: 在要求输入数字处找到非数字字符
      

  4.   

    应该是字符集问题,中文字符集的话 mon对应的是 xx月,英文字符集mon对应的是英文的前几个字符
      

  5.   

    如果格式为YY且只提供了最后2位年份,那么服务器会在前面自动添加当前年份的前两位;
    如果格式为YYY且只提供了最后2位年份,那么服务器会同YY格式一样操作;
    如果格式为YYYY且只提供了最后2位年份,那么服务器会在前面接00;
    如果格式为RR或RRRR且只提供了最后2位年份,则确定世纪的规则如下:
    确定指定年世纪的规则如下:
    ● 如果指定年在00~49之间,并且当前年份在00~49之间,那么指定年的世纪就与当前年份的世纪相同。因此,指定年的前两位数字就等于当前年份的前两位数字。例如,如果指定年为15,而当前年份为2007,那么指定年就是2015。
    ● 如果指定年在50~99之间,并且当前年份在00~49之间,那么指定年的世纪就等于当前年份的世纪减去1。因此,指定年的前两位数字等于当前年份的前两位数字减去1。例如,如果指定年为75,而当前年份为2007,那么指定年就是1975。
    ●  如果指定年在00~49之间,并且当前年份在50~99之间,那么指定年的世纪就等于当前年份的世纪加上1。因此,指定年的前两位数字等于当前年份的前两位数字加上1。例如,如果指定年为15,而当前年份为2075,那么指定年就是2115。
    ●  如果指定年在50~99之间,并且当前年份在50~99之间,那么指定年的世纪就与当前年份的世纪相同。因此,指定年的前两位数字就等于当前年份的前两位数字。例如,如果指定年为55,而当前年份为2075,那么指定年就是2055。
     
      

  6.   


    使用YY格式
    如果日期中的年份采用的格式为YY,并且只提供了2位的年份,那么就认为这一年的世纪与数据库服务器上当前设置的世纪相同。因此,指定年份的前两位数字与当前年份的前两位数字相同。例如,如果提供的年份是15,而当年是2007年,那么提供的年份就是2015年。同理,如果提供的年份是75,那么就是2075年。
    注意:
    如果日期中的年份使用YYYY格式,但是只提供了2位的年份,那么Oracle数据库就会使用YY格式来解释日期。
    下面来看一个查询,它在处理年份15和75时使用YY格式。在下面这个查询中,注意向TO_DATE()函数输入的年份是15和75,其输出又被传递给TO_CHAR函数,后者将日期转换为DD-MON-YYYY格式的字符串(此处使用了YYYY格式,这样就可以看到TO_DATE函数返回的4位年份)。 SELECTTO_CHAR(TO_DATE('04-JUL-15', 'DD-MON-YY'), 'DD-MON-YYYY'),TO_CHAR(TO_DATE('04-JUL-75', 'DD-MON-YY'), 'DD-MON-YYYY')FROM dual;TO_CHAR(TO_ TO_CHAR(TO_----------- -----------04-JUL-2015 04-JUL-2075 正如期望的一样,15和75分别被解释为2015年和2075年。使用RR格式 
    如果日期中的年份采用的格式为RR,并且只提供了最后2位年份,那么年份中的前两位数字就由两部分共同确定:提供年份的两位数字(指定年),数据库服务器上当前日期中年份的后2位数字(当年)。确定指定年世纪的规则如下:● 规则1 如果指定年在00~49之间,并且当前年份在00~49之间,那么指定年的世纪就与当前年份的世纪相同。因此,指定年的前两位数字就等于当前年份的前两位数字。例如,如果指定年为15,而当前年份为2007,那么指定年就是2015。● 规则2 如果指定年在50~99之间,并且当前年份在00~49之间,那么指定年的世纪就等于当前年份的世纪减去1。因此,指定年的前两位数字等于当前年份的前两位数字减去1。例如,如果指定年为75,而当前年份为2007,那么指定年就是1975。● 规则3 如果指定年在00~49之间,并且当前年份在50~99之间,那么指定年的世纪就等于当前年份的世纪加上1。因此,指定年的前两位数字等于当前年份的前两位数字加上1。例如,如果指定年为15,而当前年份为2075,那么指定年就是2115。● 规则4 如果指定年在50~99之间,并且当前年份在50~99之间,那么指定年的世纪就与当前年份的世纪相同。因此,指定年的前两位数字就等于当前年份的前两位数字。例如,如果指定年为55,而当前年份为2075,那么指定年就是2055。