Oracle11g 强制Oracle';s sysdate为多个语句返回不同的值
我想强制OracleOracle11g 强制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
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”