[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 konwersjiDATE
doVARCHAR2
za pomocąNLS_DATE_FORMAT
parametr 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
YYYY
dla 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 DUAL
Wyjście :
DT ---------- 0019-06-17
Jeśli nie zamierzasz naprawiać niejawnej konwersji ciągów, prawdopodobnie chciałbyś:
TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
lub (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
MM
model formatu dlaMON
sformatowane dane – niekoniecznie jest to problem, ponieważMM
pasuje również doMON
iMONTH
ale prawdopodobnie powinieneś użyć właściwego modelu.