Вы можете просто объединить столбцы (явно или неявно преобразованные в строки) вместе и использовать 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