プロが教える店舗&オフィスのセキュリティ対策術

オラクルで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のフォーマットが、使い方によって変わるのはなぜなのでしょうか。

A 回答 (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)を
使うのが好ましいと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。関数のパラメーターのデータ型から追求していけばよかったなあと思いました。
select to_char(sysdate) from DUAL; を実行して確認してみました。

どうしてもyyyy/mm/ddフォーマットでINSERTしなければならないデータだったので、to_char関数を使用後に、translateとconcatenateを使って対応することにしました。

お礼日時:2006/03/27 11:18

クライアント側でNLS_DATE_FORMAT 環境変数を設定していませんか?



日付のフォーマットは接続クライアントの役割で
NLS_DATE_FORMATまたはNLS_TERRITORYによって変化します。

データベースサーバ自身も接続クライアントですから
デフォルトのNLS_DATE_FORMATを暗黙変換で使用します。
クライアントの NLS_DATE_FORMAT とサーバの NLS_DATE_FORMAT が異なっているからでしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/03/24 19:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!