2016-08-22 59 views
0

我有像oracle這樣的包含日期字段的表。我需要在此日期字段中單獨更新年份。我怎樣才能做到這一點 ?如何在oracle中單獨更新year字段?

表1

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:日期時間/間隔PRECIS離子超出java.sql.SQLException中的範圍

:ORA-30088:日期時間/間隔精度超出範圍

期望輸出

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

你究竟想要做什麼? '(2014)'部分對於區間文字無效。如果你只是想增加兩年使用'+ interval'2'year' –

回答

1

這應該工作:

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

這將更新未來2年的日期。無需添加條款

1

您可以使用時間間隔來調整顯示的值的日期,但有些日期會失敗;例如,如果您的某行有2016-02-29,那麼嘗試添加兩年的間隔將得到錯誤ORA-01839: date not valid for month specified,因爲2018-02-29不是有效日期。間隔添加只是完全按照所示添加時間間隔,它不會嘗試補償閏年,或者(如果您添加月數而不是年數)每個月的不同天數。 (這在documentation about datetime/interval arithmetic的第六個項目符號中提到)。

它的安全使用the add_months() function,不錯誤,但默默的調整產生的結果,你需要注意的:

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    

爲您更新,你會做同樣的事情:

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

您的where子句看起來有點奇怪。您可能只想更新具體的值,但這會更新20014,2015和2016年中所有這兩個不確定的行。您正在應用您的rownum過濾器,而不進行任何排序。如果您想要限制更新行的數量,但不希望它們是隨機行,則需要分兩步識別和更新行(例如,使用具有子查詢的相關更新)。