我有一个VARCHAR2列,字符串包含日期和时间。我已经提取了日期,现在希望仅使用日期和时间来填充新列。
到目前为止,我有:
alter table t
add cb_time
as
select substr(t.notes, 24, INSTR(t.notes, 'for')-1)
from Mytable t
这导致错误ORA 2000 - 缺失(关键字
答案 0 :(得分:2)
另一种方法是将CB_TIME
创建为虚拟列。要使用类似以下的ALTER TABLE:
ALTER TABLE T
ADD CB_TIME DATE GENERATED ALWAYS AS
(TO_DATE(SUBSTR(t.notes, 24, INSTR(t.notes, 'for')-1))) VIRTUAL;
由于虚拟列不能被插入或更新,因此这样做意味着NOTES
字段必须始终包含有效的日期字符串。
分享并享受。
答案 1 :(得分:1)
因为您使用11g,并且正如您所说两列都在同一个表中。我建议,不要添加静态列,而是添加虚拟列。
因此,您也不必担心插入。 Oracle会在没有实际存储的情况下为您提供计算值。
只需将虚拟列添加为 -
即可编辑最后没有一个结束括号。
ALTER TABLE t ADD
column_name GENERATED ALWAYS AS (to_date(substr(t.notes, 24, INSTR(t.notes, 'for')-1))) VIRTUAL;
注意但您需要谨慎。只有正确评估表达式,虚拟列才能工作。在这种情况下,如果 datetime literal 格式错误,则虚拟列将失败。确保基本列中的所有值都具有正确的datetime文字格式。
答案 2 :(得分:0)
你应该把它作为两个独立的操作。
alter table t add cb_time date;
update t set cb_time = to_date(substr(...
答案 3 :(得分:0)
您首先要添加ALTER TABLE
列,然后发出UPDATE
:
ALTER TABLE t
ADD cb_time DATE;
UPDATE t
SET cb_time = SUBSTR(t.notes, 24, INSTR(t.notes, 'for')-1);
但您还应该同时将该值转换为DATE
:
UPDATE t
SET cb_time = TO_DATE(SUBSTR(t.notes, 24, INSTR(t.notes, 'for')-1));
确保t.notes
中的值包含日期(可能使用正则表达式)甚至可能是个好主意,这样您在更新时就不会收到错误。
答案 4 :(得分:0)
你可以试试;
alter table t add cb_time date;
update t set cb_time = to_date(substr(t.notes, 24, INSTR(t.notes, 'for')-1);