[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 avDATEtill enVARCHAR2medNLS_DATE_FORMATsessionsparameter 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
YYYYfö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 DUALUtdata :
DT ---------- 0019-06-17Om 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 weekeller (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
MMformatmodell förMONformaterad data – detta är inte nödvändigtvis ett problem eftersomMMmatchar ävenMONochMONTHmen du bör förmodligen använda rätt modell.