[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í konverziDATEnaVARCHAR2pomocíNLS_DATE_FORMATparametr 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
YYYYpro 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 DUALVýstup :
DT ---------- 0019-06-17Pokud 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 weeknebo (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
MMformátový model proMONformátovaná data – to nemusí být nutně problém, protožeMModpovídá takéMONaMONTHale pravděpodobně byste měli použít správný model.