2016-07-23 8 views
0

Oracleのテーブルに挿入しました。 PLSQLのない私の実装は次のようになります。日付形式を「yyyy/mm/dd」から「mm-dd-yyyy」に変更しました。

SELECT to_date('1900-01-01','YYYY-MM-DD') + (rownum - 1) AS DT_CAL, 
     rownum AS NUM_JOUR 
FROM dual 
CONNECT BY to_date('1900-01-01','YYYY-MM-DD') + (rownum - 1) <= 
                 to_date('2000-12-31','YYYY-MM-DD') 

結果は次のとおりです。05/28/1900、ない1900-05-28。問題の内容を理解できるように助けてくれますか?

答えて

1

to_date()は文字列パラメータを取得し、2番目のパラメータで指定した形式に一致させ、日付フィールドを作成します。日付フィールドは、2番目のパラメータで指定したフォーマットを使用していません。実際にはフォーマットのない内部データ表現を使用して格納されます(可能性の高い数値)。

バックアウト日付フィールドからの結果でフォーマットを提示するために、あなたがいずれかをすることができます

  1. は、クライアントがして、ローカライズされたフォーマットを提供するために、(セッション・レベルで)NLSパラメータを設定し、クエリを実行して持っていますALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';ステートメント)または
  2. 既存のフィールドの周囲にto_char(..., 'YYYY-MM-DD')を使用すると、日付を元の状態に戻すことができます。 ...を現在の列定義に置き換えます。

アプローチ#1はすでに発生しています。現在のフォーマットを生成しているNLS_DATE_FORMATセットが既に存在するため、あなたが必要としないフォーマットになっています。 、あなたはそうすることができます。あなたができない場合、あなたはフォーマットを一貫して一貫して他の方法で持たなければならない場合は、#2が行く方法かもしれません。

+1

これは正解です。 「プロダクション」クエリでは、他のユーザのNLS設定を制御することができないため、必要な日付書式モデルで常にto_char(DATE_COLUMN、 '.....')を使用することをお勧めします。 OPのためには、彼/彼女自身の結果をチェックするだけで、NLS_DATE_FORMATソリューションで十分です。オラクル社が内部日付の保存に使用する内部形式に関する注意:OTNの "BluShadow"は良い説明です。自分で調べるには、SELECT DUMP(SYSDATE)FROM DUALを実行して理解してみてください。それは明らかではありませんが、数字ではなく、7つの数字です。 – mathguy

+0

リンク:https://community.oracle.com/docs/DOC-991195 – mathguy

+1

@mathguy日付の形式も次のとおりです[Stackoverflow Documentation](http://stackoverflow.com/documentation/oracle/2087/dates/) 6848/the-date-of-date#t = 201607240002226712408)。 – MT0

1

DATEデータ型にはフォーマットがありません。 Oracleはこれを7- or 8-bytesのいずれかとして保存します。クライアント・プログラム(SQL/Plus、SQL Developer、Toad、Java、Pythonなど)に渡され、クライアント・プログラムは日付形式を取得します。

SQL/PlusまたはSQL Developerを使用している場合は、NLS_DATE_FORMATセッションパラメータを使用して日付をフォーマットします。

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

(これは現在のセッションのみにフォーマットを変更し、任意の他のセッション/ユーザーのためにそれを変更しないことに注意してください。)

をあなたが与えたい場合:使用してYou can change this日付は特定のフォーマットconvert it to a stringする必要があります。

+0

私はto_char( '2006-01-01'、 'YYYY-MM-DD')を使用するとこのエラーが発生します。 –

+0

ORA-00932:矛盾したデータ型:期待された日付はNUMBERを取得 –

+2

'' 2006-01-01'' is文字列リテラルで、日付ではありません。 'DATE '2006-01-01'は日付リテラルです。 – MT0

関連する問題