[TL;DR] Stačí použít:TO_CHAR( tbl.col, 'IW' )
Máte několik problémů:
-
Voláte
TO_DATE( string, format_model )
sDATE
(nikoliVARCHAR2
), což způsobí, že Oracle provede implicitní konverziDATE
naVARCHAR2
pomocíNLS_DATE_FORMAT
parametr session jako model formátu, abyste jej mohli převést zpět naDATE
. Takže efektivně děláte:TO_CHAR( TO_DATE( TO_CHAR( tbl.col, ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' ) ), 'YYYY/MM/DD' ), 'IW' )
Nedělejte to , stačí použít:
TO_CHAR( tbl.col, 'IW' )
Pokud to uděláte, pak jsou následující problémy irelevantní.
- Jak upozorňuje RealCheeseLord, pozice roku a dne ve vašem modelu formátu je obrácená; a
-
Používáte
YYYY
pro model formátu roku, takže všechny roky budou v 1. století našeho letopočtu.Příklad :
SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt FROM DUAL
Výstup :
DT ---------- 0019-06-17
Pokud se nechystáte opravit implicitní převod řetězce, pravděpodobně budete chtít buď:
TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
nebo (v závislosti na tom, zda chcete, aby rok 99 byl 1999 nebo 2099):
TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
-
Používáte
MM
formátový model proMON
formátovaná data – to nemusí být nutně problém, protožeMM
odpovídá takéMON
aMONTH
ale pravděpodobně byste měli použít správný model.