Cuando trabajamos en Oracle con fechas, puede interesarnos el año en formato de 4 dígitos. En este momento, ¿qué máscara debemos utilizar con la función "to_date" o "to_char"?, ¿YYYY o RRRR?.
Para elegir una u otra opción, consideremos lo siguiente:
1. No importa usarla con mayúsculas o minúsculas (YYYY o yyyy).
2. No es recomendable usar la función "trunc" antes de cualquiera de las dos funciones mencionadas porque perderemos los dos dígitos más a la izquierda del año (19 ó 20 normalmente).
3. El formato RRRR está pensado para evitar el Efecto 2000. De manera que, si tenemos una fecha con formato "dd/mm/yy" y aplicamos una máscara RRRR se calcularán los dos dígitos del año que faltan presuponiendo que se trata de una fecha posterior a 1950. Es decir, aplicando la función "to_date" (no "to_char") se realiza la siguiente conversión:
3.1. Si YY está entre 00 y 49, con la máscara RRRR conseguiremos 20YY. Por ejemplo, 12/08/01 será 12/08/2001. En caso de usar la máscara YYYY, conseguiríamos 12/08/0001.
3.2. Si YY está entre 50 y 99, con la máscara RRRR conseguiremos 19YY. Por ejemplo, 12/08/83 será 12/08/1983. En caso de usar la máscara YYYY, conseguiríamos 12/08/0083.
4. Debemos tener en cuenta que "to_date" y "to_char" nos devuelven resultados distintos al aplicar YYYY sobre una fecha con un año de dos dígitos. Veamos cuál es el resultado de aplicar las máscaras con una y otra función usando como ejemplo la variable "sysdate" que, por defecto, almacena solo los dos últimos dígitos del año:
select to_date(sysdate, 'dd/mm/rrrr') from dual; -- Devuelve 27/08/2010.
select to_char(sysdate, 'dd/mm/rrrr') from dual; -- Devuelve 27/08/2010.
select to_date(sysdate, 'dd/mm/yyyy') from dual; -- Devuelve 27/08/0010.
select to_char(sysdate, 'dd/mm/yyyy') from dual; -- Devuelve 27/08/2010.