sql >> Base de Datos >  >> RDS >> Oracle

No es un mes válido en Oracle cuando se usa add_months

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.