我想强制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
声明中提供给程序,但上面的示例似乎为我复制了这个问题。
UPDATE
我发现有用的一件事是在语句之间暂停,但这真的不是我想要的:
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);
正如文档中所述,the sysdate
function返回一个date,其精度只有几秒 - 它不支持小数秒。因此,同一秒内的多个调用将始终获得相同的值,并且您无法强制它执行任何其他操作。
您将该日期值放入timestamp列,这会导致从一种数据类型到另一种数据类型的隐式转换,但该转换无法设置/创建新的小数秒值 - 它保留了从日期开始的隐式小数秒,当然总是零。
与sysdate
一样,Oracle有a systimestamp
function,它返回timestamp with time zone值 - 并且确实有小数秒。精度受到您运行的平台的限制。如果使用它来填充普通时间戳列,则仍会发生隐式转换,但您基本上只是丢弃时区信息。
Oracle还支持current_date
和current_timestamp
,它们非常相似 - 除了它们返回当前会话时区的日期/时间,而不是像sys*
版本那样返回服务器时区。
我发现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