[TL;DR] Просто използвайте:TO_CHAR( tbl.col, 'IW' )
Имате множество проблеми:
-
Извиквате
TO_DATE( string, format_model )
сDATE
(не еVARCHAR2
), което кара Oracle да извърши имплицитно преобразуване наDATE
къмVARCHAR2
използвайкиNLS_DATE_FORMAT
параметър на сесията като модел на формат само за да можете да го конвертирате обратно вDATE
. И така, вие ефективно правите:TO_CHAR( TO_DATE( TO_CHAR( tbl.col, ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' ) ), 'YYYY/MM/DD' ), 'IW' )
Не правете това , просто използвайте:
TO_CHAR( tbl.col, 'IW' )
Ако го направите, тогава следните проблеми са неуместни.
- Както посочва RealCheeseLord, позицията на годината и деня във вашия модел на формат е обърната; и
-
Вие използвате
YYYY
за модела на формат на годината, така че всички години ще бъдат през 1-ви век след Христа.Пример :
SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt FROM DUAL
Изход :
DT ---------- 0019-06-17
Ако няма да коригирате имплицитното преобразуване на низове, вероятно ще искате едно от двете:
TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
или (в зависимост от това дали искате годината 99 да бъде 1999 или 2099):
TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
-
Вие използвате
MM
модел на формат заMON
форматирани данни - това не е непременно проблем, тъй катоMM
също съответства наMON
иMONTH
но вероятно трябва да използвате правилния модел.