• ベストアンサー

sysdateのフォーマットが変わります

オラクルでsysdateをとろうとすると、現在わたしの使っている実装ではselect sysdate from DUALに対し、例えば 2006/03/24 18:13:42 が 返されます。 しかしsysdateを関数の中で使うと最初の"20"と時分秒がなくなり、06-03-24のような値が返されます。例えば以下のようなSQLにおいてです。 select translate(sysdate,'1234567890-','1234567890-') from DUAL; select substr(sysdate,1) from DUAL; sysdateのフォーマットが、使い方によって変わるのはなぜなのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>select translate(sysdate,'1234567890-','1234567890-') from DUAL; >select substr(sysdate,1) from DUAL; これらのSQLでのSYSDATEは、関数のパラメータになっていますが、 関数は、VARCHAR2/CHAR属性のパラメータを想定しています。 なので、オラクルは、暗黙に"TO_CHAR(SYSDAE)"を実行しています。 で、TO_CHARでの日付書式がデフォルト値になるので、NLSパラメータに 左右されて、yy-mm-ddな扱いになります。 今回のように、SQL文の中での日付書式に関しては、クライアントのNLSでなく サーバサイドの環境によって決まるはずですので、そちらを確認してください。 出来ることなら、日付書式のデフォルトに左右されないよう明示的な型変換(TO_CHAR)を 使うのが好ましいと思います。

sharat2005
質問者

お礼

ありがとうございます。関数のパラメーターのデータ型から追求していけばよかったなあと思いました。 select to_char(sysdate) from DUAL; を実行して確認してみました。 どうしてもyyyy/mm/ddフォーマットでINSERTしなければならないデータだったので、to_char関数を使用後に、translateとconcatenateを使って対応することにしました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • MZ-80B
  • ベストアンサー率56% (46/81)
回答No.1

クライアント側でNLS_DATE_FORMAT 環境変数を設定していませんか? 日付のフォーマットは接続クライアントの役割で NLS_DATE_FORMATまたはNLS_TERRITORYによって変化します。 データベースサーバ自身も接続クライアントですから デフォルトのNLS_DATE_FORMATを暗黙変換で使用します。 クライアントの NLS_DATE_FORMAT とサーバの NLS_DATE_FORMAT が異なっているからでしょう。

sharat2005
質問者

お礼

ありがとうございます。NLS_DATE_FORMATがどのように設定されているのか調べてみます。

すると、全ての回答が全文表示されます。

関連するQ&A