2017-05-31 3 views
0

'MON-YY'形式から年を取得し、フェッチされた年を'01 -JUN 'と連結しようとしています。同じクエリが特定のデータベースで正常に動作しますが、別のデータベースにエラーがスローされます

01-JUN-17 
:私は強制的に以下のコードは、例えばDB_1

select to_date('01-JUN-'||(EXTRACT(YEAR FROM to_date('MAY-17','mon-yy')))) AS YEAR_START_DATE from dual; 

リターンのために特定のデータベースに正常に動作します日付 'タイプ から '文字列'('01 -JUN-17' )' を変換するためにTO_DATEを使用しました

しかしdb_2を同じコードでは、次のエラーがスローされます

ORA-01858: a non-numeric character was found where a numeric was expected 
01858. 00000 - "a non-numeric character was found where a numeric was  expected" 
*Cause: The input data to be converted using a date format model was 
     incorrect. The input data did not contain a number where a number was 
     required by the format model. 
     *Action: Fix the input data or the date format model to make sure the 
     elements match in number and type. Then retry the operation. 

誰かが助けてくださいことはできますか?

答えて

1
'01-JUN-' || EXTRACT(YEAR FROM to_date('MAY-17','mon-yy')) 

を使用すると、書式モデルを指定せずにTO_DATE(datestring, format_model)を使用しようとすると問題が発生する'01-JUN-2017'

のような文字列を生成します。この場合、クエリはNLS_DATE_FORMATセッションパラメータを使用します。

あなたは使用して、この値を見つけることができます。これはあなたが、それは例外が発生します指定した形式と一致しない場合

SELECT VALUE 
FROM SYS.NLS_SESSION_PARAMETERS 
WHERE PARAMETER - 'NLS_DATE_FORMAT'; 

を。

明示的書式モデル(および言語)を指定する必要があります

SELECT TO_DATE(
     '01-JUN-'||EXTRACT(YEAR FROM to_date('MAY-17','mon-yy','NLS_LANGUAGE="ENGLISH"')), 
     'dd-MON-YYYY', 
     'NLS_LANGUAGE="ENGLISH"' 
     ) AS YEAR_START_DATE 
FROM DUAL; 

それとも、使用することができます:返信用

SELECT ADD_MONTHS(
     TRUNC(
      TO_DATE('MAY-17', 'MON-YY', 'NLS_LANGUAGE="ENGLISH"'), 
      'YY' 
     ), 
     5 
     ) AS YEAR_START_DATE 
FROM DUAL; 
+0

こんにちはMT0 ..返事ありがとう!あなたは正しいです、私はコードでformat_modelを見逃しました。だから私はあなたの最初のコードを試してみました。そして、それはdb2の価値を返しました。しかし、前回の声明を実行したので、それはdb2でうまくいきました。 – joe

+0

私はこのクエリを実行しました:select to_date(( '' 01-JUN- '||(EXTRACT(YEAR FROM to_date(' MAY-17 '、' mon-yy '))))))AS YEAR_START_DATE from dual; 01-JUN-17を返します。 – joe

0

最初の日付('01 -JUN- '..)の日付形式がありません。あるデータベースの日付形式はおそらくDD-MON-YYYYですが、他のデータベースではDD-MM-YYYYとなります。

select to_date('01-JUN-' || (extract(year from to_date('MAY-17', 'mon-yy'))),'DD-MON-YYYY') as year_start_date 
    from dual; 

これは、文字列からと日付を変換する際に、必ずフォーマットを指定することをお勧めします:あなたのクエリは次のようになります日付形式を追加した後

+0

こんにちはルネ!!感謝を! NLS_DATE_FORMATを意味しますか?私は両方のデータベースのNLS_DATE_FORMATとその 'DD-MON-RR'をチェックしました。 – joe

関連する問題