Как объединить целочисленные столбцы для формирования даты в Oracle SQL - PullRequest
0 голосов
/ 27 марта 2019

У меня есть таблица со столбцами salDay, SalYear и Salmonth.saLday хранит целые числа от 1 до 31, salYear хранит целые годы, например 2013,2015 ... и salMonth хранит целые месяцы от 1 до 12. Я хочу заполнить другой столбецВызывается receive_date путем объединения salday, salmonth и salyear для получения даты в виде ДД / ММ / ГГГГ.

есть идеи, пожалуйста?

1 Ответ

1 голос
/ 27 марта 2019

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