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

时间:2018-12-25 03:33:47

标签: oracle11g oracle-sqldeveloper sysdate

我想强制Oracle sysdate函数为单独的语句返回不同的值,就像在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);

2 个答案:

答案 0 :(得分:3)

如文档中所述,the sysdate function返回date,该精度仅精确到秒,不支持小数秒。因此,同一秒钟内的多个调用将始终获得相同的值,并且您不能强迫它执行其他任何操作。

您正在将该日期值放入timestamp列中,这会导致从一种数据类型到另一种数据类型的隐式转换,但是该转换无法设置/创建新的小数秒值-它会保持从日期算起的隐式小数秒,当然始终为零。

Oracle和sysdate一样,还有a systimestamp function,它返回一个timestamp with time zone值-的确是小数秒。精度受您所运行的平台的限制。如果使用该字段填充普通的timestamp列,则仍会发生隐式转换,但实际上您只是丢弃了时区信息。

Oracle还支持current_datecurrent_timestamp,它们非常相似-区别在于它们返回当前会话时区中的日期/时间,而不是返回服务器时区中的{{1} }版本。

答案 1 :(得分:2)

我发现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