What is the difference between 'YYYY' and 'RRRR' in Oracle SQL

I have 2 queries in SQL:

select trunc(to_date('27-Jul-1987'),'YYYY') FROM dual; 

and

select trunc(to_date('27-Jul-1987'),'RRRR') FROM dual; 

Both are giving me the same result. What is the difference between 'RRRR' and 'YYYY'?


YYYY gives the current year as 4 digits.

RRRR format means 2-digit years in the range 00 to 49 are assumed to be in the current century (ie have the same first two digits as the current year), and years given as 50 through 99 are assumed to be in the previous century.


If the first 2 digits for the year are not specified in the date to be converted:

  • YYYY will always return the current year.
  • RRRR returns the year based on the current specified year in the database.

Try this sample code:

SELECT TO_DATE ('010199', 'MMDDYYYY') AS date_a,
       TO_DATE ('010199', 'MMDDYY') AS date_b,
       TO_DATE ('010199', 'MMDDRR') AS date_c,
       TO_DATE ('010199', 'MMDDRRRR') AS date_d
  FROM DUAL;

The results when run on 12/01/2014:

 DATE_A       DATE_B       DATE_C        DATE_D   
 ---------    ---------    ---------     ---------  
 1/1/0099      1/1/2099     1/1/1999      1/1/1999

This oracle link gives a great description and examples.

From the above link:

  • If the specified two-digit year is 00 to 49, then
    • If the last two digits of the current year are 00 to 49, then the returned year has the same first two digits as the current year.
    • If the last two digits of the current year are 50 to 99, then the first 2 digits of the returned year are 1 greater than the first 2 digits of the current year.
  • If the specified two-digit year is 50 to 99, then
    • If the last two digits of the current year are 00 to 49, then the first 2 digits of the returned year are 1 less than the first 2 digits of the current year.
    • If the last two digits of the current year are 50 to 99, then the returned year has the same first two digits as the current year.

This:

SQL> select  to_char(to_date('72-01-01','rrrr-mm-dd'),'yyyy') from dual;

will give you:

1972

But this:

SQL> select  to_char(to_date('72-01-01','yyyy-mm-dd'),'yyyy') from dual;

will give you:

0072