私のアプリケーションでは、次のコマンドを使用して、セッションの NLS_DATE_FORMAT を設定して、プログラムによって返されるすべての日付をフォーマットしています。
alter session set nls_date_format='DY DDTH MON YYYY';
これは次のような日付を返すはずです: 'Fri 23rd Aug 2013'
ただし、次のクエリを実行すると:
select SYSDATE from dual;
「2013 年 8 月 23 日金曜日」という形式で日付を取得します。「23」の後に「rd」がないことに注意してください。
次のクエリを実行すると:
select to_char(sysdate, 'DY DDTH MON YYYY') from dual;
日付は目的の形式で返されます。では、NLS_DATE_FORMAT を使用して設定すると、'TH' 日付形式パラメーターが機能しないのはなぜですか? また、NLS_DATE_FORMAT ではなく TO_CHAR を使用する場合に機能する他の日付形式パラメーターはありますか?
ご協力いただきありがとうございます
ちなみに、Oracle 11.2 のクライアントとデータベースを使用しています。
アップデート
SQL Developer内からalter sessionコマンドを実行していました。これを SQL PLUS で試したところ、正しい形式で日付が返されました。ただし、フォーマットされた日付の挿入に問題があります。
(上記のように NLS_DATE_FORMAT を設定した後に) 次の操作を行うと、「ORA-01861 リテラルがフォーマット文字列と一致しません」というエラーが表示されます。
INSERT INTO DATE_TABLE (MY_DATE_COL) VALUES ('Thu 18th Apr 2013');
NLS_DATE_FORMAT を設定した後、それが機能すると思いますか?
挿入ステートメントを次のように変更すると:
INSERT INTO DATE_TABLE (MY_DATE_COL) VALUES ('Thu 18 Apr 2013');
それならうまくいく!どうしてこれなの?