在插入触发器之前创建以在SQL中添加sysdate + 30分钟

时间:2019-02-13 09:58:45

标签: sql oracle

我有带时间戳列的表 我想在每个插入上添加 添加当前时间戳+ 30分钟

如何实现 我正在使用oracle 11g;

2 个答案:

答案 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;
/