[TL;DR] Verwenden Sie einfach:TO_CHAR( tbl.col, 'IW' )
Sie haben mehrere Probleme:
-
Sie rufen
TO_DATE( string, format_model )
auf mit einemDATE
(keinVARCHAR2
), wodurch Oracle eine implizite Konvertierung desDATE
durchführt zu einemVARCHAR2
mit demNLS_DATE_FORMAT
session-Parameter als Formatmodell, damit Sie es wieder in einDATE
umwandeln können . Sie tun also effektiv:TO_CHAR( TO_DATE( TO_CHAR( tbl.col, ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' ) ), 'YYYY/MM/DD' ), 'IW' )
Tun Sie dies nicht , verwenden Sie einfach:
TO_CHAR( tbl.col, 'IW' )
Wenn Sie das tun, sind die folgenden Punkte irrelevant.
- Wie RealCheeseLord betont, ist die Position von Jahr und Tag in Ihrem Formatmodell umgekehrt; und
-
Sie verwenden
YYYY
für das Jahresformatmodell werden also alle Jahre im 1. Jahrhundert n. Chr. liegen.Beispiel :
SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt FROM DUAL
Ausgabe :
DT ---------- 0019-06-17
Wenn Sie die implizite Zeichenfolgenkonvertierung nicht beheben möchten, möchten Sie wahrscheinlich eines von beiden:
TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
oder (je nachdem, ob das Jahr 99 1999 oder 2099 sein soll):
TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
-
Sie verwenden das
MM
Formatmodell fürMON
formatierte Daten - dies ist nicht unbedingt ein Problem, daMM
passt auch zuMON
undMONTH
aber Sie sollten wahrscheinlich das richtige Modell verwenden.