Nunca, nunca uses TO_DATE()
en algo que ya es una DATE
. La razón de esto es que Oracle tendrá que hacer algunas conversiones implícitas para seguir sus deseos:
TO_DATE(sysdate, 'mm-yyyy')
se ejecuta realmente como
TO_DATE(TO_CHAR(sysdate, '<default nls_date_format parameter>'), 'mm-yyyy')
así que si su nls_date_format está configurado en algo que no sea 'mm-yyyy', tendrá problemas. El parámetro predeterminado nls_date_format es 'DD-MON-YY', que es más que probable que sea el valor establecido para el suyo.
Si todo lo que quería hacer era agregar_meses al día 1 del mes actual, entonces debería usar TRUNC()
, por ejemplo:
add_months(trunc(sysdate, 'MM'),-12)
Aquí hay una prueba del to_char implícito si to_date algo que ya es una fecha, según lo solicitado por Lalit:un plan de ejecución de una consulta básica que involucra to_date(sysdate):
SQL_ID 3vs3gzyx2gtcn, child number 0
-------------------------------------
select * from dual where to_date(sysdate) < sysdate
Plan hash value: 3752461848
----------------------------------------------------------------------------
| Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(TO_DATE(TO_CHAR([email protected]!))<[email protected]!)
Puedes ver claramente el TO_CHAR()
en la condición de filtro.