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

问题描述 投票:1回答:2

我想强制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);
oracle11g oracle-sqldeveloper sysdate
2个回答
3
投票

正如文档中所述,the sysdate function返回一个date,其精度只有几秒 - 它不支持小数秒。因此,同一秒内的多个调用将始终获得相同的值,并且您无法强制它执行任何其他操作。

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

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

Oracle还支持current_datecurrent_timestamp,它们非常相似 - 除了它们返回当前会话时区的日期/时间,而不是像sys*版本那样返回服务器时区。


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
© www.soinside.com 2019 - 2024. All rights reserved.