如何提取DATE的年份并将其插入新列?

时间:2015-05-22 12:33:13

标签: sql oracle

我的表中有一个包含DATE的列,我只需要保留YEAR(= NUM​​BER或INT类型中的>)

我的想法是添加一个列并尝试这样的事情:

UPDATE myTable SET newColumn=(
select to_number(to_char(oldColumn.year, 'yyyy')) from myTable)

但是我收到了这个错误:

  

单行子查询返回多行

你能帮忙吗?!?

5 个答案:

答案 0 :(得分:3)

您需要将查询更改为:

UPDATE myTable 
SET newColumn=to_number(to_char(oldColumn.year, 'yyyy'))

SELECT语句将返回表oldColumn.year中的所有行,这将生成您的"单行子查询返回多行"错误。

(select to_number(to_char(oldColumn.year, 'yyyy')) from myTable)

答案 1 :(得分:2)

您可以使用EXTRACT功能:

UPDATE myTable 
SET    newColumn = EXTRACT( YEAR FROM oldColumn.year )

答案 2 :(得分:2)

insert into table_name (v_date)
values ((select extract (year from current_date())));

答案 3 :(得分:2)

这样做是个坏主意。仅存储一部分日期几乎没有任何用处。此外,您将无法在列上执行任何日期算术。

要获取年份值,Oracle会提供显示的日期时间格式。对于基于年份的任何日期计算,您只需要这样做:

EXTRACT(YEAR FROM date_column)

如果您仍想更改设计并仅存储日期部分,请使用 VIRTUAL COLUMN 而不是创建静态列。

例如,

dt_yyyy NUMBER GENERATED ALWAYS AS (EXTRACT(YEAR FROM date_column)) VIRTUAL

或者,

dt_yyyy NUMBER GENERATED ALWAYS AS (to_number(to_char(date_column, 'YYYY'))) VIRTUAL

注意:虚拟列是从11g引入的。

答案 4 :(得分:0)

这看起来像是一个完美的情况,如果你至少11g使用虚拟列。考虑我的测试表的这个create table语句,其中v_year是虚拟列:

CREATE TABLE X_TEST
(
  COL2       LONG,
  COL3       VARCHAR2(50 BYTE),
  COL4       VARCHAR2(50 BYTE),
  COL5       VARCHAR2(50 BYTE),
  COL6_DATE  DATE,
  V_YEAR     NUMBER Generated Always as (EXTRACT(YEAR FROM "COL6_DATE"))
);

现在,只需插入日期和Bam!这一年是自动化的!无需特殊更新。

SQL> insert into X_TEST (col6_date) values (sysdate);

1 row created.

SQL> select col6_date, v_year from X_TEST;

COL6_DATE     V_YEAR
--------- ----------
22-MAY-15       2015

SQL>

更多信息和示例:http://oracle-base.com/articles/11g/virtual-columns-11gr1.php