强制 Oracle 的 sysdate 为 return 多个语句的不同值

Force Oracle's sysdate to return different value for multiple statements

我想强制 Oracle sysdate 函数为单独的语句 return 不同的值,就像在 Postgres 中一样。我已经对文档、网络和 SO 本身进行了一些挖掘,但找不到解决这个问题的答案。

这方面的文档似乎很差:see for yourself

我将 Oracle 11g 与 SQL Developer 18.3

一起使用

请阅读下面的 MVCE。

执行后:

create table t(a timestamp);
insert into t values (sysdate);
insert into t values (sysdate);
insert into t values (sysdate);
select * from t;

我得到:

A                          
---------------------------
18/12/25 04:25:59,000000000
18/12/25 04:25:59,000000000
18/12/25 04:25:59,000000000

我想得到(手改):

A                          
---------------------------
18/12/25 04:25:59,1234
18/12/25 04:25:59,7281
18/12/25 04:26:00,1928

真正的问题出现在对过程的不同 CALL 语句中,但上面的示例似乎为我复制了这个问题。


更新

我发现有一个有用的方法是在语句之​​间放置停顿,但这并不是我想要的:

set pause on;
create table t(a timestamp);
insert into t values (sysdate);
pause
insert into t values (sysdate);
pause
insert into t values (sysdate);

我发现 current_timestamp 可以做到:

drop table t;
create table t(a timestamp);
insert into t values (current_timestamp);
insert into t values (current_timestamp);
insert into t values (current_timestamp);
select * from t;

输出:

A                          
---------------------------
18/12/25 04:48:54,134000000
18/12/25 04:48:54,142000000
18/12/25 04:48:54,149000000

如文档中所述,the sysdate function returns a date 只能精确到秒 - 它不支持小数秒。因此,同一秒内的多次调用将始终获得相同的值,并且您不能强制它执行任何其他操作。

您将该日期值放入 timestamp 列,这会导致从一种数据类型到另一种数据类型的隐式转换,但该转换不能 set/create 新的小数秒value - 它保留日期的隐式小数秒,当然它始终为零。

sysdate 一样,Oracle 具有 a systimestamp function, which returns a timestamp with time zone 值 - 并且确实有小数秒。精度受您 运行 所在平台的限制。如果您使用它来填充您的普通时间戳列,那么隐式转换仍然会发生,但您实际上只是丢弃了时区信息。

Oracle 还支持 current_date and current_timestamp,它们非常相似 - 除了它们 return 当前会话时区的 date/time,而不是服务器时区的 sys* 个版本。