Поскольку у вас есть столбец отметки времени, вероятно, лучше использовать systimestamp
вместо sysdate
и добавить интервал, а не дробь дня, что приведет к потере точности до доли секунды (и часового пояса, если ваш столбецна самом деле это тоже хранится).
Вы бы либо просто имели дату (если вы используете sysdate + 30/1440
), либо неявно конвертировали в дату (если вы используете systimestamp + 30/1440
);и в любом случае вы получите дату, которая затем неявно или явно преобразуется в метку времени, хранящуюся в вашем столбце.
В качестве простого примера использования интервала:
create table t42 (col1 number, col2 timestamp);
create trigger tr42
before insert on t42
for each row
begin
:new.col2 := systimestamp + interval '30' minute;
end;
/
select systimestamp from dual;
SYSTIMESTAMP
---------------------------------
2019-02-13 07:17:11.971542000 GMT
insert into t42 (col1) values (42);
select col1, col2 from t42;
COL1 COL2
---------- -----------------------------
42 2019-02-13 07:47:12.253603000
Вы также можете использовать значение по умолчанию для столбца вместо триггера:
create table t42 (
col1 number,
col2 timestamp default systimestamp + interval '30' minute
);
select systimestamp from dual;
SYSTIMESTAMP
---------------------------------
2019-02-13 07:17:12.962268000 GMT
insert into t42 (col1) values (42);
select col1, col2 from t42;
COL1 COL2
---------- -----------------------------
42 2019-02-13 07:47:13.028670000
, хотя это позволяет человеку, выполняющему вставку, предоставить свое собственное значение:
insert into t42 (col1, col2) values (43, timestamp '2000-01-01 00:00:00.0');
select col1, col2 from t42;
COL1 COL2
---------- -----------------------------
42 2019-02-13 07:47:13.028670000
43 2000-01-01 00:00:00.000000000
Триггер будет переопределять любое предоставленное пользователем значение (хотя его также можно изменить, но не на.)
Вы также можете использовать current_timestamp
вместо systimestamp
- , они делают немного разные вещи .