【问题标题】:how to update the year field alone in oracle?如何在oracle中单独更新年份字段?
【发布时间】:2016-12-28 19:21:15
【问题描述】:

我在 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 |

【问题讨论】:

  • 你到底想做什么? (2014) 部分对于区间文字无效。如果您只想增加两年,请使用 + interval '2' year

标签: sql oracle oracle11g


【解决方案1】:

这应该可行:

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

这将更新未来 2 年的日期。无需添加where子句

【讨论】:

    【解决方案2】:

    您可以使用间隔来调整您显示的日期的值,但有些日期会失败;例如,如果您的某一行有 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 过滤器而没有任何排序。如果您确实想限制更新的行数,但不希望它们是随机行,则需要分两步识别和更新行(例如,使用具有子查询的相关更新)。

    【讨论】:

      【解决方案3】:
      Update table_name set column_name=Add_months(sysdate,-(extract(year from sysdate)-2019)*12) where ...;
      

      您可以指定需要更新的年份来代替 2019 年

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-19
        • 2022-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多