[TL;DR] Brug blot:TO_CHAR( tbl.col, 'IW' )
Du har flere problemer:
-
Du kalder
TO_DATE( string, format_model )
med enDATE
(ikke enVARCHAR2
), hvilket får Oracle til at foretage en implicit konvertering afDATE
til enVARCHAR2
ved hjælp afNLS_DATE_FORMAT
sessionsparameter som formatmodellen, bare så du kan konvertere den tilbage til enDATE
. Så du gør effektivt: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 ikke dette , brug bare:
TO_CHAR( tbl.col, 'IW' )
Hvis du gør det, er følgende spørgsmål irrelevante.
- Som RealCheeseLord påpeger, er positionen af år og dag i din formatmodel omvendt; og
-
Du bruger
YYYY
for årsmodellen, så alle årene vil være i det 1. århundrede e.Kr.Eksempel :
SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt FROM DUAL
Output :
DT ---------- 0019-06-17
Hvis du ikke vil rette den implicitte strengkonvertering, vil du sandsynligvis enten have:
TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
eller (afhængigt af om du vil have år 99 til at være 1999 eller 2099):
TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
-
Du bruger
MM
formatmodel forMON
formaterede data - dette er ikke nødvendigvis et problem somMM
matcher ogsåMON
ogMONTH
men du skal nok bruge den rigtige model.