[TL;DR] Utilisez simplement :TO_CHAR( tbl.col, 'IW' )
Vous avez plusieurs problèmes :
-
Vous appelez
TO_DATE( string, format_model )
avec uneDATE
(pas unVARCHAR2
) qui oblige Oracle à effectuer une conversion implicite de laDATE
à unVARCHAR2
en utilisant leNLS_DATE_FORMAT
paramètre de session comme modèle de format juste pour que vous puissiez le reconvertir enDATE
. Ainsi, vous faites effectivement :TO_CHAR( TO_DATE( TO_CHAR( tbl.col, ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' ) ), 'YYYY/MM/DD' ), 'IW' )
Ne faites pas cela , utilisez simplement :
TO_CHAR( tbl.col, 'IW' )
Si vous faites cela, les problèmes suivants ne sont pas pertinents.
- Comme le souligne RealCheeseLord, la position de l'année et du jour dans votre modèle de format est inversée ; et
-
Vous utilisez
YYYY
pour le modèle de format d'année, toutes les années seront donc au 1er siècle après JC.Exemple :
SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt FROM DUAL
Sortie :
DT ---------- 0019-06-17
Si vous n'allez pas corriger la conversion de chaîne implicite, vous voudrez probablement :
TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
ou (selon que vous voulez que l'année 99 soit 1999 ou 2099) :
TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
-
Vous utilisez le
MM
modèle de format pourMON
données formatées - ce n'est pas nécessairement un problème carMM
correspond également àMON
etMONTH
mais vous devriez probablement utiliser le bon modèle.