sql - 在插入触发器之前创建以在 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
-它们做的事情略有不同。
推荐阅读
- elasticsearch - 如何使用 DSL 查询丢弃 ElasticSearch 中的重复值?
- google-api - 当我请求 Google 自定义搜索时,我得到了 429
- html - 图像在响应式布局中对齐
- javascript - 我如何在 Vuejs 中查看多维键
- javascript - 获取对象数组,在对象中查找嵌套数组,计算 TotalAmount 并添加回原始对象
- php - 为什么我无法为 PHP 安装我的命令?
- selenium - 将 testng xml 报告导入 jira xray 时出错
- laravel - 升级表格 7 后 Laravel 8 身份验证不起作用
- python - 我的烧瓶应用程序路由文件有什么问题?我的路线可能没有注册或有其他问题
- python - Seaborn 箱线图晶须与计算不匹配