2016-08-22 198 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过滤器,而不进行任何排序。如果您想要限制更新行的数量,但不希望它们是随机行,则需要分两步识别和更新行(例如,使用具有子查询的相关更新)。