[TL;RD] Simplemente use:TO_CHAR( tbl.col, 'IW' )
Tiene varios problemas:
-
Estás llamando a
TO_DATE( string, format_model )
con unaDATE
(no unVARCHAR2
) que hace que Oracle realice una conversión implícita deDATE
a unVARCHAR2
usando elNLS_DATE_FORMAT
parámetro de sesión como modelo de formato solo para que pueda volver a convertirlo enDATE
. Entonces, efectivamente estás haciendo:TO_CHAR( TO_DATE( TO_CHAR( tbl.col, ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' ) ), 'YYYY/MM/DD' ), 'IW' )
No hagas esto , solo usa:
TO_CHAR( tbl.col, 'IW' )
Si lo hace, los siguientes problemas son irrelevantes.
- Como señala RealCheeseLord, la posición del año y el día en su modelo de formato está invertida; y
-
Estás usando
YYYY
para el modelo de formato de año, por lo que todos los años estarán en el siglo I d.C.Ejemplo :
SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt FROM DUAL
Salida :
DT ---------- 0019-06-17
Si no va a corregir la conversión de cadena implícita, probablemente desee:
TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
o (dependiendo de si quieres que el año 99 sea 1999 o 2099):
TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
-
Estás usando el
MM
modelo de formato paraMON
datos formateados:esto no es necesariamente un problema ya queMM
también coincide conMON
yMONTH
pero probablemente deberías usar el modelo correcto.