Oracle11g 强制Oracle';s sysdate为多个语句返回不同的值

Oracle11g 强制Oracle';s sysdate为多个语句返回不同的值,oracle11g,oracle-sqldeveloper,sysdate,Oracle11g,Oracle Sqldeveloper,Sysdate,我想强制Oraclesysdate函数为单独的语句返回不同的值,就像在Postgres中一样。我在文档、网络等方面做了一些挖掘,但找不到解决这个问题的答案 对于这一个,文档似乎很差: 我正在使用Oracle 11g和SQL Developer 18.3 请阅读下面的MVCE 执行此命令后: create table t(a timestamp); insert into t values (sysdate); insert into t values (sysdate); insert into

我想强制Oracle
sysdate
函数为单独的语句返回不同的值,就像在Postgres中一样。我在文档、网络等方面做了一些挖掘,但找不到解决这个问题的答案

对于这一个,文档似乎很差:

我正在使用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
我想得到(手工更改):

真正的问题出现在对过程的不同
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\u 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

我发现
current\u 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

如文档中所述,返回a,其精度仅为秒-不支持小数秒。因此,同一秒钟内的多个调用将始终获得相同的值,您不能强制它执行任何其他操作

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

除了sysdate,Oracle还有,它返回一个值,并且有小数秒。精度受运行平台的限制。如果您使用它来填充普通时间戳列,那么仍然会发生隐式转换,但实际上您只是丢弃了时区信息


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

如文档中所述,返回的a的精度仅为秒-它不支持小数秒。因此,同一秒钟内的多个调用将始终获得相同的值,您不能强制它执行任何其他操作

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

除了sysdate,Oracle还有,它返回一个值,并且有小数秒。精度受运行平台的限制。如果您使用它来填充普通时间戳列,那么仍然会发生隐式转换,但实际上您只是丢弃了时区信息


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

即使您可以这样做,您确定它会完全解决您的问题吗?我的意思是,假设两个插入恰好发生在足够近的地方,以至于
SYSDATE
值仍然显示相同?@TimBiegeleisen这不是多用户环境,目的只是为了我自己的培训。我正在执行不同的语句,但我没有观察到调用之间的任何差异,这对于我从其他DBMS的经验中学到的很奇怪。即使您可以这样做,您确定它会完全解决您的问题吗?我的意思是,假设两个插入恰好发生在足够近的地方,以至于
SYSDATE
值仍然显示相同?@TimBiegeleisen这不是多用户环境,目的只是为了我自己的培训。我正在执行不同的语句,但我没有观察到调用之间的任何差异,这对于我从其他DBMS的经验中所学到的是很奇怪的。因为您是从
sysdate
开始的,所以您可能需要
systimestamp
而不是
current\u timestamp
。因为您是从
sysdate
开始的,您可能想要
systimestamp
而不是
current\u timestamp
-。谢谢Alex。在哪里处理转换似乎是一个选择的问题。很好的补充:)谢谢您的解释,但是如果我在一个持续20秒的大型
选择
查询中有两个
sysdate
,该怎么办呢。Oracle是一次性解析所有的
sysdate
s还是所有的
systimestamp
s?看起来这些函数是一次性解析的<代码>选择“sysdate”作为函数,选择“sysdate”作为从双联返回的数据,选择“systimestamp”,从双联返回的systimestamp全部选择“systimestamp”,从双联返回的systimestamp全部选择“current_timestamp”,从双联返回的systimestamp全部选择“current_timestamp”,双联当前时间戳全部选择'sysdate',双联sysdate全部选择'systimestamp',双联systimestamp
见第3、4、5、6和8行的
RETURN
列的值。谢谢。在哪里处理转换似乎是一个选择的问题。很好的补充:)谢谢您的解释,但是如果我在一个持续20秒的大型
选择
查询中有两个
sysdate
,该怎么办呢。Oracle是一次性解析所有的
sysdate
s还是所有的
systimestamp
s?看起来这些函数是一次性解析的<代码>选择“sysdate”作为函数,选择“sysdate”作为从双联返回的数据,所有选择“systimestamp”,双联返回的systimestamp都选择“systimestamp”,双联返回的systimestamp都选择“current_timestamp”,双联返回的systimestamp都选择“systimestamp”,双联返回的systimestamp都选择“systimestamp”