[TL;DR] Basta usar:
TO_CHAR( tbl.col, 'IW' )
Você tem vários problemas:
-
Você está chamandoTO_DATE( string, format_model )
com umDATE
(não umVARCHAR2
) que faz com que o Oracle faça uma conversão implícita doDATE
para umVARCHAR2
usando oNLS_DATE_FORMAT
parâmetro de sessão como o modelo de formato apenas para que você possa convertê-lo de volta para umDATE
. Então, você está efetivamente fazendo:
TO_CHAR( TO_DATE( TO_CHAR( tbl.col, ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' ) ), 'YYYY/MM/DD' ), 'IW' )
Não faça isso , Apenas use:
TO_CHAR( tbl.col, 'IW' )
Se você fizer isso, os seguintes problemas serão irrelevantes.
- Como RealCheeseLord aponta, a posição do ano e do dia em seu modelo de formato é invertida; e
-
Você está usandoYYYY
para o modelo de formato de ano, então todos os anos serão no século I dC.
Exemplo :
SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt FROM DUAL
Saída :
DT ---------- 0019-06-17
Se você não vai corrigir a conversão de string implícita, provavelmente vai querer:
TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
ou (dependendo se você deseja que o ano 99 seja 1999 ou 2099):
TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
-
Você está usando oMM
modelo de formato paraMON
dados formatados - isso não é necessariamente um problema, poisMM
também corresponde aMON
eMONTH
mas você provavelmente deve usar o modelo correto.