如何在Oracle SQL中合并整数列以形成日期

时间:2019-03-27 16:35:55

标签: oracle-sqldeveloper

我有一个表,其中列salDay,SalYear和Salmonth.saLday存储1到31之间的整数,salYear存储整数年(例如2013、2015 ...)和salMonth存储1到12之间的整数月份。我想填充另一列通过组合salday,salmonth和salyear来调用Received_date,以DD / MM / YYYY的形式获取日期。

有什么想法吗?

1 个答案:

答案 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