首页 > 解决方案 > 在插入触发器之前创建以在 sql 中添加 sysdate + 30 分钟

问题描述

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

如何使用 oracle 11g 实现这一点;

标签: sqloracle

解决方案


由于您有一个时间戳列,因此最好使用它来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-它们做的事情略有不同


推荐阅读