2 つの問題があります。
日付形式が dd-mm-rr であるテーブルに格納されているデータの場合。
これは完全に間違っています。Oracle は、表示される形式で日付を保存しません。表示されるのは表示用です。Oracleは、各バイトが DATE のさまざまな要素を表す独自の内部形式でDATEを格納します。7 bytes
Byte Description
---- -------------------------------------------------
1 Century value but before storing it add 100 to it
2 Year and 100 is added to it before storing
3 Month
4 Day of the month
5 Hours but add 1 before storing it
6 Minutes but add 1 before storing it
7 Seconds but add 1 before storing it
locale_specific NLS_DATE_FORMATに依存しないでください。常に使用:
- TO_CHARは、希望する形式で日付を表示します
- TO_DATEを使用して、文字列を明示的に日付に変換します。
TO_DATEはNLS に依存することに注意してください。
日付要素しかなく、時間要素を気にしない場合は、固定形式に従うANSI 日付リテラルを使用することをお勧めします。 'YYYY-MM-DD'
ジャンク文字で月表示のみ
これも、 NLS_DATE_LANGUAGEに依存しているためです。私が言ったように、ロケール固有のクライアント設定に依存することは避けるべきです。時間要素を気にしない場合は、明示的に言及するNLS_DATE_LANGUAGE
か、ANSI 日付リテラルを使用してください。
例えば、
SQL> SELECT TO_CHAR(SYSDATE, 'DD-MON-RR') dt FROM DUAL;
DT
---------
26-OCT-15
SQL> alter session set nls_date_language='french';
Session altered.
SQL> SELECT TO_CHAR(SYSDATE, 'DD-MON-RR') dt FROM DUAL;
DT
-----------
26-OCT. -15
それで、上で何が起こったのですか?FRENCH を使用している人にとって、nls_date_language
MONTHはジャンク値を示しています。を明示的に言及して、NLS に依存しないようにしましょうnls_date_language
。
SQL> SELECT TO_CHAR(SYSDATE, 'DD-MON-RR', 'nls_date_language=english') dt FROM DUAL;
DT
---------
26-OCT-15
また、NLS_LANG値が OS環境変数に正しく設定されていない可能性があります。ジャンク値/特殊文字/クエスチョン マークがクライアントに表示されるのはなぜですか? を参照してください。