我的表中有一个包含DATE的列,我只需要保留YEAR(= NUMBER或INT类型中的>)
我的想法是添加一个列并尝试这样的事情:
UPDATE myTable SET newColumn=(
select to_number(to_char(oldColumn.year, 'yyyy')) from myTable)
但是我收到了这个错误:
单行子查询返回多行
你能帮忙吗?!?
答案 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