我有一个表,其中列salDay,SalYear和Salmonth.saLday存储1到31之间的整数,salYear存储整数年(例如2013、2015 ...)和salMonth存储1到12之间的整数月份。我想填充另一列通过组合salday,salmonth和salyear来调用Received_date,以DD / MM / YYYY的形式获取日期。
有什么想法吗?
答案 0 :(得分:1)
您可以将列(显式或隐式转换为字符串)串联在一起,并使用to_date()
将结果转换为实际日期:
create table your_table (salDay number, salMonth number, salYear number);
insert into your_table (salDay, salMonth, salYear) values (27, 3, 2019);
select to_date(salYear ||'-'|| salMonth ||'-'|| salDay, 'YYYY-MM-DD') as salDate
from your_table;
SALDATE
-------------------
2019-03-27 00:00:00
如果要将其作为表中的另一列,则可以使用具有相同转换的虚拟列:
alter table your_table
add salDate date generated always as (to_date(salYear ||'-'|| salMonth ||'-'|| salDay, 'YYYY-MM-DD'));
Table YOUR_TABLE altered.
select * from your_table;
SALDAY SALMONTH SALYEAR SALDATE
---------- ---------- ---------- -------------------
27 3 2019 2019-03-27 00:00:00
当然,如果您的日期无效,这两个问题都会出现。在第一种情况下,使用该查询会出错。在第二个查询新列时,它将出错。但这并不会阻止您将不良数据放入静止状态。
insert into your_table (salDay, salMonth, salYear) values (29, 2, 2019);
1 row inserted.
select * from your_table;
ORA-01839: date not valid for month specified
您可以在该虚拟列上使用索引或约束来防止这种情况发生-任何会导致尝试将转换作为插入的一部分的操作,而这又会导致插入失败:
create index your_index on your_table (salDate);
Index YOUR_INDEX created.
insert into your_table (salDay, salMonth, salYear) values (29, 2, 2019);
ORA-01839: date not valid for month specified