Oracle
 sql >> Base de données >  >> RDS >> Oracle

Pas un mois valide dans Oracle lorsque add_months est utilisé

N'utilisez jamais, jamais TO_DATE() sur quelque chose qui est déjà une DATE . La raison en est qu'Oracle devra effectuer des conversions implicites afin de suivre vos souhaits :

TO_DATE(sysdate, 'mm-yyyy')

est vraiment exécuté comme

TO_DATE(TO_CHAR(sysdate, '<default nls_date_format parameter>'), 'mm-yyyy')

donc si votre nls_date_format est défini sur autre chose que 'mm-aaaa', vous allez avoir des problèmes. Le paramètre nls_date_format par défaut est 'DD-MON-YY', ce qui est plus que probablement la valeur sur laquelle le vôtre est défini.

Si tout ce que vous vouliez faire était d'ajouter_mois au 1er du mois en cours, alors vous devriez utiliser TRUNC() , par exemple :

add_months(trunc(sysdate, 'MM'),-12)

Voici la preuve du to_char implicite si vous to_date quelque chose qui est déjà une date, comme demandé par Lalit - un plan d'exécution d'une requête de base impliquant 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]!)

Vous pouvez clairement voir le TO_CHAR() dans l'état du filtre.