2016-04-14 33 views
2

私はinsert into Store values(1, '04/04/2012 13:35 PM');を使用していくつかのデータを挿入しようとすると、私はこのエラーSQL Error: ORA-01843: not a valid monthが発生し、今
CREATE TABLE Store (id number(11) primary key not null, opening_time timestamp CHECK (EXTRACT(HOUR FROM opening_time) > 8 || NULL));

このクエリを使用してテーブルを作成しました。

私は間違っているとは何ですか?遭遇したSQLエラー:ORA-01843:無効な月

+0

[なぜこの日付をsqlを使用してテーブルに入力できないのですか?](http://stackoverflow.com/questions/35149206/why-cant-i-enter-this-date-into-a -table-using-sql) – MT0

答えて

2

'04/04/2012 13:35 PM'は文字列です。書式マスク(ノートとしてNLS_DATE_FORMATセッションパラメータの値を使用してDATE列に挿入するときにOracleが非日付リテラルに暗黙のTO_DATE(string_value, format_mask)を行います

:これはセッションパラメータであり、クライアントに属し、それグローバル設定ではありません)。非日付のリテラルがこのフォーマットにマッチすれば、それはうまくいくでしょう。もしそうならないと、NLS_DATE_FORMATが変更された場合、直ちに破棄されます。動作していたコードは誰もコードを変更しませんでした)。

クエリを使用して、現在のNLS_DATE_FORMATを見つけることができます。

SELECT VALUE 
FROM NLS_SESSION_PARAMETERS 
WHERE PARAMETER = 'NLS_DATE_FORMAT'; 

明示的に正しい書式マスクでTO_DATE()を使用するか(すなわちDATE '2012-04-04'またはTIMESTAMP '2012-04-04 13:35')リテラルのANSI/ISOの日付を使用することをお勧めします。あなたが行うことができます

INSERT INTO STORE (id, opening_time) 
    VALUES(1, TO_DATE('04/04/2012 13:35', 'DD/MM/YYYY HH24:MI'); 

(時間のコンポーネントは24時間制にすでにあるとして、あなたがAM/PMを必要としない)

または

INSERT INTO STORE (id, opening_time) 
    VALUES(1, TIMESTAMP '2012-04-04 13:35:00'); 

( Oracleが暗黙的に日付に変換するANSI/ISOタイムスタンプ・リテラルを使用)

0

テーブルに主キーの値を挿入する必要はありません。それは自動生成されます。などTO_DATE機能を使用して、日付のフォーマットを提供しよう:

insert into Store values(to_date('04/04/2012 13:35 PM','DD/MM/YYYY HH:MI AM')); 
2

SQL Error: ORA-01843: not a valid month

'04/04/2012 13:35 PM'文字列なく日付です。明示的に文字列を日付に変換するには、常にTO_DATEを使用する必要があります。 暗黙のデータ型変換に頼ることは決してありません。あなたのロケール固有のNLS設定に依存するのは幸運かもしれません。ただし、NLSの設定が異なる場合は機能しません。したがって、TO_DATEを使用して、適切な形式のマスクを使用してリテラルを日付に変換してください。

単にDATEデータ型を使用して、datetime値、タイムスタンプを使用する必要はありませんを見てみます。秒までの精度まで保持できます。

CREATE TABLE Store (id number(11) primary key not null, 
        opening_time timestamp 
        CHECK (EXTRACT(HOUR FROM opening_time) > 8 || NULL)); 

insert into Store 
values(1, TO_DATE('04/04/2012 13:35 PM', 'DD/MM/YYYY HH:MI', 'nls_date_language=ENGLISH')); 

また固定フォーマットを使用していますので、それが独立したNLSあるANSI date/timestamp literalを使用することができます。

DATE '2012-04-04' 

または

TIMESTAMP '2012-04-04 13:35:00' 
+0

単純な標準SQLに準拠したリテラルではなく、TO_DATE/TO_TIMESTAMPを使用してOracleのすべてのユーザーがなぜですか? 'DATE '2012-04-04''または' TIMESTAMP' 2012-04-04 13:35:00''はNLS設定に依存しません。 – dnoeth

+0

@dnoeth私もANSIの日付/タイムスタンプリテラルを提案します。ここで私の意図は、OPにデータ型を知らせることです。とにかく、いつもより多くの情報を追加するのは良いことです。 –

-1

ストア値(1、'04 -APR-2012午後01時35分PM ')に挿入します。

これは私のために働く。

+1

'NLS_DATE_FORMAT'セッション・パラメータの値をフォーマット・マスクとして使用して、日付以外のリテラルにDATE列に暗黙の' TO_DATE(string_value、format_mask) 'を挿入します。日付以外のリテラルがこの形式と一致する場合、それは動作します(そうでない場合はそうではありません)が、パラメータは**クライアントの**セッションに属し、ユーザー間で一貫性があるとは限りません。 – MT0

0

データ形式にto_date関数を使用することをお勧めします。 あなたはそれがする場合は:あなたはofficial documentationにここで見つけることができます。この機能について

insert into Store 
values(1, to_date('04/04/2012 13:35', 'DD/MM/YYYY HH24:mi')); 

詳細を。

関連する問題