我想强制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);
答案 0 :(得分:3)
如文档中所述,the sysdate
function返回date,该精度仅精确到秒,不支持小数秒。因此,同一秒钟内的多个调用将始终获得相同的值,并且您不能强迫它执行其他任何操作。
您正在将该日期值放入timestamp列中,这会导致从一种数据类型到另一种数据类型的隐式转换,但是该转换无法设置/创建新的小数秒值-它会保持从日期算起的隐式小数秒,当然始终为零。
Oracle和sysdate
一样,还有a systimestamp
function,它返回一个timestamp with time zone值-的确是小数秒。精度受您所运行的平台的限制。如果使用该字段填充普通的timestamp列,则仍会发生隐式转换,但实际上您只是丢弃了时区信息。
Oracle还支持current_date
和current_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