[TL;DR] Använd bara:TO_CHAR( tbl.col, 'IW' )
Du har flera problem:
-
Du anropar
TO_DATE( string, format_model )
med enDATE
(inte enVARCHAR2
) vilket får Oracle att göra en implicit konvertering avDATE
till enVARCHAR2
medNLS_DATE_FORMAT
sessionsparameter som formatmodellen bara så att du kan konvertera den tillbaka till enDATE
. Så du gör faktiskt:TO_CHAR( TO_DATE( TO_CHAR( tbl.col, ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' ) ), 'YYYY/MM/DD' ), 'IW' )
Gör inte detta , använd bara:
TO_CHAR( tbl.col, 'IW' )
Om du gör det är följande frågor irrelevanta.
- Som RealCheeseLord påpekar är positionen för år och dag i din formatmodell omvänd; och
-
Du använder
YYYY
för årsmodellen så att alla år kommer att vara i det 1:a århundradet e.Kr.Exempel :
SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt FROM DUAL
Utdata :
DT ---------- 0019-06-17
Om du inte ska fixa den implicita strängkonverteringen så vill du förmodligen antingen:
TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
eller (beroende på om du vill att år 99 ska vara 1999 eller 2099):
TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
-
Du använder
MM
formatmodell förMON
formaterad data – detta är inte nödvändigtvis ett problem eftersomMM
matchar ävenMON
ochMONTH
men du bör förmodligen använda rätt modell.