2016-08-22 11 views
0

私はOracleのような日付フィールドを含むようなテーブルを持っています。この日付フィールドで年だけを更新する必要があります。どうやってやるの ?oracleで年フィールドのみを更新する方法は?

TABLE1

DAY_DATE   | 
--------------------| 
2014-07-31 16:00:00 | 
2014-07-31 16:00:00 | 

しようとしたクエリ

UPDATE table1 
SET day_date = day_date+INTERVAL '2' YEAR(2014) 
where extract(year from day_date) between 2014 and 2016 AND rownum < 3 

エラー

SQLエラー[30088] [99999]:ORA-30088:日時/間隔プレシスイオンは、java.sql.SQLExceptionを

範囲

の外で:ORA-30088:日時/間隔の精度は、これは動作するはず範囲

予想される出力

DAY_DATE   | 
    --------------------| 
    2016-07-31 16:00:00 | 
    2016-07-31 16:00:00 | 
+0

あなたは正確に何をしようとしていますか? '(2014)'部分は区間リテラルに対して無効です。 2年追加する場合は、 '+ interval '2' year' –

答えて

1

の外にある:

UPDATE table1 
SET day_date = day_date+INTERVAL '2' YEAR 

これは、今後2年間の日付に更新されます。どこの句を追加する必要はありません。

1

表示された値で日付を調整できますが、失敗する日付があります。たとえば、行の1つが2016-02-29の場合、2年間の間隔を追加しようとすると、エラーORA-01839: date not valid for month specifiedが発生します.2018-02-29は有効な日付ではありません。インターバルの追加は、表示されているとおり正確に区間を追加するだけで、閏年を補うことはしません。また、月ごとに異なる月数を追加する場合もあります。 (これはdocumentation about datetime/interval arithmeticの6番目の箇条書きに記載されています)。あなたが同じことをするだろう、あなたの更新のために

with table1 (day_date) as (
    select date '2016-02-28' from dual 
    union all select date '2016-02-29' from dual 
    union all select date '2016-03-01' from dual 
) 
select day_date, add_months(day_date, 24) 
from table1; 

DAY_DATE ADD_MONTHS(DAY_DATE,24) 
---------- ----------------------- 
2016-02-28 2018-02-28    
2016-02-29 2018-02-28    
2016-03-01 2018-03-01    

それはエラーではなく、静かに、あなたが知っておく必要がある生成された結果を、調整しないthe add_months() functionを、使用する方が安全です

UPDATE table1 
SET day_date = add_months(day_date, 24) 
where ... 

あなたのwhere句はちょっと変わっています。特定の値を更新したいだけかもしれませんが、これにより、20014年、2015年および2016年のすべてのものから2つの不確定行が更新されます。rownumフィルターを注文なしで適用しています。更新される行の数を制限し、それらの行がランダムな行にならないようにするには、2つの手順で行を識別して更新する必要があります(副照会を持つ相関更新など)。

関連する問題