我有带时间戳列的表 我想在每个插入上添加 添加当前时间戳+ 30分钟
如何实现 我正在使用oracle 11g;
答案 0 :(得分:1)
当您有一个时间戳列时,最好使用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
-they do slightly different things。
答案 1 :(得分:0)
您可以如下所示创建触发器。每次您在表格中插入一行时,都会插入当前时间戳+ 30分钟。
create or replace trigger before_insert
before insert
on table_name for each row
declare
v_time date;
begin
select sysdate+30/1440 into v_time from dual;
:new.cur_time :=v_time;
end;
/