首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时由Oracle生成systimestamp

何时由Oracle生成systimestamp
EN

Stack Overflow用户
提问于 2017-11-03 17:38:28
回答 1查看 450关注 0票数 0

何时在Oracle查询中生成systimestamp函数的返回值?返回的值与查询提交或结束的时刻有关?如果在子查询中使用该函数?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-03 17:47:59

注意事项:下面讨论的是仅针对的SQL 。在与Oracle相关联的过程编程语言PL/SQL中,sysdatesystimestamp的行为不同。请参阅乔恩·海勒在下面的评论,以及他在评论中提供的链接。备注结尾

systimestamp是在执行查询的开始时计算一次的。它将在查询及其所有子查询中具有相同的值,无论查询中引用systimestamp有多深,也不管它引用了多少次。

例如,以下(故意令人费解的)查询总是返回零:

代码语言:javascript
复制
select sum (abs(   date '2000-01-01' 
                 + ( systimestamp - (select systimestamp from dual) )
                 - date '2000-01-01'
               )
           )
from   dual
connect by level <= 300000;

注意到:在这个答案下面的注释中,OP指出--尽管systimestamp - systimestamp总是返回零(这是它应该返回的),但是systimestamp - (systimestamp - 1)返回类似于+01 00:00:00.762611的东西。这是出乎意料的。所以让我们解释一下。

使用数字的日期算术(如1表示某一天)是用于date数据类型的表达式,而不是时间戳。因此,对于操作systimestamp - 1,时间戳首先被截断--只保留整秒,小数点之后的秒数被丢弃。

然后,对于类型为时间戳日期的操作,Oracle将首先将日期转换为时间戳,然后取差异并返回间隔。这就是OP看到的。秒的分数是由于systimestamp - 1计算的截断造成的,而第一个systimestamp不是截断的。

为了得到相同的计算“完成正确”(并确保结果确实将是+01 00:00:00.000000),我们必须使用正确的数据类型,当我们从systimestamp中减去一天。也就是说,就像数字是日期算法的“我们应该使用的东西”一样,对于时间戳算法,我们必须使用interval数据类型。

代码语言:javascript
复制
select systimestamp - (systimestamp - interval '1' day) from dual

将始终准确地返回+01 00:00:00.000000

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47101555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档