NLS_TIMESTAMP_FORMATを変更した結果


4

私は9.2.0.8データベースを管理します。NLS_TIMESTAMP_FORMATに設定されています'DD-MON-RR HH.MI.SSXFF AM';

これを使用すると奇妙な結果になります。CAST TO TIMESTAMP関数:

select CAST('14-SEP-2011' AS TIMESTAMP) "DATE" from dual;
----------
14-SEP-2020 11:00:00.000000 AM 

変更した場合NLS_TIMESTAMP_FORMAT'DD-MON-YYYY HH.MI.SSXFF AM'それから私は行ってもいいです。

変更しますかNLS_TIMESTAMP_FORMATデータベース上のパラメータYYYY何か影響がありますか?

4

データベースレベルNLS_DATE_FORMATそしてNLS_TIMESTAMP_FORMATパラメータは常にクライアント設定によって上書きされるため、パラメータは特に役に立ちません。データベースの設定を変更しても、ユーザーがデータベースにアクセスして接続する時間の99 +%は、ユーザーのセッションがNLS_DATE_FORMATそしてNLS_TIMESTAMP_FORMATクライアントのNLS_LANGまたは他の各国語設定(つまり、シンJDBCドライバーを使用するアプリケーションは、クライアントに頼らずにJVMの国際化設定を使用します)NLS_LANGデータベースで行った設定を無効にします。使用してデータベースジョブを含むいくつかのコーナーケースがありますDBMS_JOBSまたはDBMS_SCHEDULERデータベースが存在するクライアントが存在しない場所NLS_DATE_FORMATそしてNLS_TIMESTAMP_FORMAT使用されている、と私は思いますが、それらはかなりまれです。

あなたはログイントリガーを作成することができますALTER SESSION設定するNLS_DATE_FORMATそしてNLS_TIMESTAMP_FORMATあなたのセッションのために。これは、クライアントがセッション作成時に要求した設定を無効にします。Nickが指摘するように、あなたは他の問い合わせが暗黙の変換のために現在の設定に依存していることを心配しなければならないでしょう、そしてあなたの変更はそのコードを壊すかもしれません。

一般に、可能な限り暗黙の変換を避けるほうがはるかに賢明ですが、特に問題のために設定している形式が多すぎるため、日付やタイムスタンプとの間で文字列を変換する場合は特にそうです。コードに日付リテラルを指定したい場合は、ANSIの日付とタイムスタンプの構文を使用したほうがはるかに良いでしょう。

SQL> ed
Wrote file afiedt.buf

    1 select cast( date '2011-09-14' as timestamp ) dt,
    2     timestamp '2011-09-14 13:15:30' ts
    3*  from dual
SQL> /

DT               TS
------------------------------ -----------------------------------
14-SEP-11 12.00.00.000000 AM  14-SEP-11 01.15.30.000000000 PM

文字列を日付またはタイムスタンプに変換したい場合は、TO_DATEまたはTO_TIMESTAMP明示的なフォーマットマスクを使用します。


0

この形式に依存する既存のクエリは異なる結果を返す可能性があります。

既存のコードがTIMESTAMPフィールドをフォーマットに依存する方法で解釈するかどうかを確認し、解釈される場合は必ず更新してください。また、 NLS_TIMESTAMP_FORMATはデータベースまたはクライアントレベルで設定できるため、クライアントがコードを実行したときに表示される形式に注意してください。