[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 desDATEdurchführt zu einemVARCHAR2mit demNLS_DATE_FORMATsession-Parameter als Formatmodell, damit Sie es wieder in einDATEumwandeln 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
YYYYfü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 DUALAusgabe :
DT ---------- 0019-06-17Wenn 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 weekoder (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
MMFormatmodell fürMONformatierte Daten - dies ist nicht unbedingt ein Problem, daMMpasst auch zuMONundMONTHaber Sie sollten wahrscheinlich das richtige Modell verwenden.