こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2006-03-24 18:15:27

QNo.2049191

困ってます

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

>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)を
使うのが好ましいと思います。

投稿日時 - 2006-03-25 13:56:39

お礼

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

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

投稿日時 - 2006-03-27 11:18:32

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

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

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

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

投稿日時 - 2006-03-24 18:49:15

お礼

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

投稿日時 - 2006-03-24 19:40:42