2

フォームとレポートの作成には、 Oracle10.2.0.4.0データベース、Oracle フォーム ビルダー、およびレポート ビルダーを使用します。

問題は本番データベースにあります nls_date_format は dd-mon-rr 形式です。開発者が開発者スーツでフォームを作成すると、フォームレベルで dd-mm-rr 形式が与えられ、テーブルにデータが保存されている場合、その日付形式はdd-mm-rr.

開発者がフォーム ビルダー内でフォームまたはレポートを実行すると、dd-mm-rr 形式になりますが、アプリケーション サーバー側から同じフォームまたはレポートを実行すると、月にジャンク文字が表示されます。文字。

どうか皆さんがうまく導きますように。

4

1 に答える 1

3

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_DATENLS に依存することに注意してください。

日付要素しかなく、時間要素を気にしない場合は、固定形式に従う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_languageMONTHジャンク値を示しています。を明示的に言及して、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環境変数に正しく設定されていない可能性があります。ジャンク値/特殊文字/クエスチョン マークがクラ​​イアントに表示されるのはなぜですか? を参照してください。

于 2015-10-26T06:50:08.887 に答える