[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à unVARCHAR2en utilisant leNLS_DATE_FORMATparamè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
YYYYpour 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 DUALSortie :
DT ---------- 0019-06-17Si 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 weekou (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
MMmodèle de format pourMONdonnées formatées - ce n'est pas nécessairement un problème carMMcorrespond également àMONetMONTHmais vous devriez probablement utiliser le bon modèle.