首页 > 解决方案 > 如何在 Oracle SQL 中组合整数列以形成日期

问题描述

我有一个表,其中列 salDay、SalYear 和 Salmonth.saLday 存储整数介于 1 和 31 之间,salYear 存储整数年份,例如 2013、2015 ......并且 salMonth 存储整数月份介于 1 和 12 之间。我想填充另一个名为 received_date 的列结合 salday、salmonth 和 salyear 以获取 DD/MM/YYYY 形式的日期。

请问有什么想法吗?

标签: oracle-sqldeveloper

解决方案


您可以将列(显式或隐式转换为字符串)连接在一起并用于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

推荐阅读