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



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

如何实现这一目标我正在使用Oracle 11G;

,因为您有一个时间戳列,最好使用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-它们做一些不同的事情。

您可以创建一个触发器,如下所示。每次将一行插入桌子时,这将插入当前的时间戳 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;
/

最新更新