[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
ただし、おそらく正しいモデルを使用する必要があります。