[TL;DR] Wystarczy użyć:TO_CHAR( tbl.col, 'IW' )
Masz wiele problemów:
-
Dzwonisz
TO_DATE( string, format_model )zDATE(nieVARCHAR2), co powoduje, że Oracle dokonuje niejawnej konwersjiDATEdoVARCHAR2za pomocąNLS_DATE_FORMATparametr sesji jako model formatu, dzięki czemu można go przekonwertować z powrotem naDATE. Tak więc skutecznie robisz:TO_CHAR( TO_DATE( TO_CHAR( tbl.col, ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' ) ), 'YYYY/MM/DD' ), 'IW' )Nie rób tego , wystarczy użyć:
TO_CHAR( tbl.col, 'IW' )Jeśli to zrobisz, następujące kwestie są nieistotne.
- Jak wskazuje RealCheeseLord, pozycja roku i dnia w modelu formatu jest odwrócona; i
-
Używasz
YYYYdla modelu rocznego, więc wszystkie lata będą przypadać na I wiek naszej ery.Przykład :
SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt FROM DUALWyjście :
DT ---------- 0019-06-17Jeśli nie zamierzasz naprawiać niejawnej konwersji ciągów, prawdopodobnie chciałbyś:
TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS weeklub (w zależności od tego, czy chcesz, aby rok 99 to 1999 czy 2099):
TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week -
Używasz
MMmodel formatu dlaMONsformatowane dane – niekoniecznie jest to problem, ponieważMMpasuje również doMONiMONTHale prawdopodobnie powinieneś użyć właściwego modelu.