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.