как эффективно заполнить столбец TIME_ID?
Использовать тип данных DATE
:
UPDATE table_name
SET time_id = TO_DATE(
TO_CHAR( year, '0000' )
|| TO_CHAR( month, '00' )
|| TO_CHAR( day, '00' ),
'YYYYMMDD'
);
Если вы действительно хотите, чтобы он был эффективнымзатем просто сохраните столбец time_id
как тип данных DATE
и выведите столбцы year
, month
и day
из него как виртуальные столбцы, а не наоборот:
CREATE TABLE table_name (
time_id DATE,
year NUMBER(4,0) GENERATED ALWAYS AS ( EXTRACT( YEAR FROM time_id ) ),
month NUMBER(2,0) GENERATED ALWAYS AS ( EXTRACT( MONTH FROM time_id ) ),
day NUMBER(2,0) GENERATED ALWAYS AS ( EXTRACT( DAY FROM time_id ) )
);
Таким образом, вы не можете вставить недопустимую дату, такую как 2018-02-31
, а столбцы YEAR
, MONTH
и DAY
всегда будут точно отражать значение в столбце TIME_ID
.
Вставка образцаданные:
INSERT INTO table_name ( time_id )
SELECT DATE '2018-12-29' FROM DUAL UNION ALL
SELECT DATE '2017-12-21' FROM DUAL;
Тогда вы можете использовать:
SELECT * FROM table_name;
TIME_ID | YEAR | MONTH | DAY
:--------- | ---: | ----: | --:
2018-12-29 | 2018 | 12 | 29
2017-12-21 | 2017 | 12 | 21
дБ <> скрипка здесь
Если вы должны использовать числа для year
, month
и day
, то для столбца time_id
, а затем снова использовать виртуальный столбец:
CREATE TABLE table_name2 (
year NUMBER(4,0),
month NUMBER(2,0),
day NUMBER(2,0),
time__id DATE GENERATED ALWAYS AS (
TO_DATE(
TO_CHAR( year, '0000' )
|| TO_CHAR( month, '00' )
|| TO_CHAR( day, '00' ),
'YYYYMMDD'
)
)
);
дБ <> скрипка здесь