[TL;DR] Basta usare:TO_CHAR( tbl.col, 'IW' )
Hai più problemi:
-
Stai chiamando
TO_DATE( string, format_model )
con unDATE
(non unVARCHAR2
) che fa sì che Oracle esegua una conversione implicita diDATE
a unVARCHAR2
utilizzando ilNLS_DATE_FORMAT
parametro di sessione come modello di formato in modo da poterlo riconvertire in unDATE
. Quindi, stai effettivamente facendo:TO_CHAR( TO_DATE( TO_CHAR( tbl.col, ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' ) ), 'YYYY/MM/DD' ), 'IW' )
Non farlo , usa:
TO_CHAR( tbl.col, 'IW' )
Se lo fai, i seguenti problemi sono irrilevanti.
- Come sottolinea RealCheeseLord, la posizione dell'anno e del giorno nel modello di formato è invertita; e
-
Stai utilizzando
YYYY
per il modello in formato anno, quindi tutti gli anni saranno nel I secolo d.C.Esempio :
SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt FROM DUAL
Risultato :
DT ---------- 0019-06-17
Se non hai intenzione di correggere la conversione implicita della stringa, probabilmente vorresti anche:
TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
oppure (a seconda che tu voglia che l'anno 99 sia 1999 o 2099):
TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
-
Stai usando il
MM
modello di formato perMON
dati formattati - questo non è necessariamente un problema in quantoMM
corrisponde anche aMON
eMONTH
ma probabilmente dovresti usare il modello corretto.