什么时候是Oracle生成的systimestamp

时间:2017-11-03 17:38:28

标签: oracle

Oracle SQL查询中生成的systimestamp函数的返回值是什么时候?返回值是指查询提交或结束的时刻?如果函数在子查询中使用?

谢谢!

1 个答案:

答案 0 :(得分:5)

注意:以下讨论仅针对SQL sysdatesystimestamp的行为在PL / SQL中是不同的,PL / SQL是与Oracle SQL相关的过程编程语言。请参阅本答案下面的Jon Heller的评论,以及他在评论中提供的链接。 结束注释

systimestamp在执行查询的BEGINNING中计算一次。它将在查询及其所有子查询中具有相同的值,无论多深,无论查询中引用systimestamp多少次。

例如,以下(故意复杂的)查询将始终返回零:

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)返回类似{{1}的内容}}。这是出乎意料的。所以,让我们解释一下。

带数字的日期算术(如1代表一天)用于表达+01 00:00:00.762611数据类型 - 不适用于时间戳。因此,对于操作date,时间戳首先截断 - 仅保留整秒,并丢弃小数点后的秒数。

然后,对于[timestamp] - [date]类型的操作,Oracle将首先将日期转换为时间戳,然后取差值并返回间隔。 OP看到的是什么。一秒的分数是由于systimestamp - 1计算的截断,而第一个systimestamp - 1没有被截断。

进行相同的计算&#34;正确完成&#34; (并且要确定结果确实是systimestamp),当我们从+01 00:00:00.000000减去一天时,我们必须使用正确的数据类型。也就是说,就像数字是&#34;我们应该使用什么&#34;对于日期算术,对于时间戳算术,我们必须使用systimestamp数据类型。

interval

将始终完全返回select systimestamp - (systimestamp - interval '1' day) from dual