[TL;DR] Gebruik gewoon:TO_CHAR( tbl.col, 'IW' )
Je hebt meerdere problemen:
-
Je belt
TO_DATE( string, format_model )
met eenDATE
(geenVARCHAR2
) waardoor Oracle een impliciete conversie uitvoert van deDATE
naar eenVARCHAR2
met behulp van deNLS_DATE_FORMAT
sessieparameter als het formaatmodel zodat u het terug kunt converteren naar eenDATE
. U doet dus effectief:TO_CHAR( TO_DATE( TO_CHAR( tbl.col, ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' ) ), 'YYYY/MM/DD' ), 'IW' )
Doe dit niet , gebruik gewoon:
TO_CHAR( tbl.col, 'IW' )
Als u dat doet, zijn de volgende problemen niet relevant.
- Zoals RealCheeseLord aangeeft, is de positie van jaar en dag in uw formaatmodel omgekeerd; en
-
U gebruikt
YYYY
voor het jaarformaat, zodat alle jaren in de 1e eeuw na Christus zullen zijn.Voorbeeld :
SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt FROM DUAL
Uitvoer :
DT ---------- 0019-06-17
Als je de impliciete tekenreeksconversie niet gaat repareren, dan zou je waarschijnlijk het volgende willen:
TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
of (afhankelijk van of je wilt dat het jaar 99 1999 of 2099 is):
TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
-
Je gebruikt de
MM
formaatmodel voorMON
geformatteerde gegevens - dit is niet noodzakelijk een probleem alsMM
komt ook overeen metMON
enMONTH
maar u moet waarschijnlijk het juiste model gebruiken.