Oracle何时生成systimestamp

Oracle何时生成systimestamp,oracle,Oracle,Oracle sql查询中何时生成systimestamp函数的返回值?返回值与提交或结束查询的时间有关?如果在子查询中使用该函数 谢谢 注意:下面的讨论仅针对SQL。sysdate和systimestamp的行为在与Oracle SQL相关联的过程编程语言PL/SQL中是不同的。请参阅Jon Heller在回答下面的评论,以及他在评论中提供的链接注释结束 systimestamp在执行查询开始时计算一次。无论查询中引用了多少次systimestamp,它在查询及其所有子查询中都具有相同的值 例

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


谢谢

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

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

例如,以下(有意卷积的)查询将始终返回零:

select sum (abs(   date '2000-01-01' 
                 + ( systimestamp - (select systimestamp from dual) )
                 - date '2000-01-01'
               )
           )
from   dual
connect by level <= 300000;

将始终准确返回
+01 00:00:00.000000
注意:下面的讨论仅针对SQL
sysdate
systimestamp
的行为在与Oracle SQL相关联的过程编程语言PL/SQL中是不同的。请参阅Jon Heller在回答下面的评论,以及他在评论中提供的链接注释结束

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

例如,以下(有意卷积的)查询将始终返回零:

select sum (abs(   date '2000-01-01' 
                 + ( systimestamp - (select systimestamp from dual) )
                 - date '2000-01-01'
               )
           )
from   dual
connect by level <= 300000;

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

我尝试了以下查询:选择systimestamp-systimestamp from dual;它返回0。这一个取而代之的是从dual中选择systimestamp-(systimestamp-1);返回+01 00:00:00.762611。答案后面的差值应该是1天(没有毫秒)…@FrancescoSerra-这是因为减去1(意味着一天)是一个
日期
操作。时间戳被强制转换为日期(意味着时间戳中的一秒小数被截断掉)。与其减去1,不如减去
interval'1'day
——从时间戳中减去interval将返回时间戳,并且不涉及舍入或截断。您将看到结果正好是1天。可能值得注意的是,PL/SQL代码并非如此,它将在每次调用systimestamp时重新计算systimestamp,正如我在中所演示的那样。@JonHeller-好的一点,我将在我的答案中添加一些内容,以提醒读者这一点。PL/SQL的行为不同是有道理的;它是一种过程语言,在过程语言中没有“读取一致性”的概念。在你的另一篇文章中,人们可能会错误地认为“过程”和“函数”之间的区别,因为函数可以从SQL调用,但过程不能。实际上,可以从PL/SQL代码中调用函数,在这种情况下,也不会有“读取一致性”。@mathguy好的一点,我更新了我的答案,试图让它更清晰。谢谢,我试过这个查询:选择systimestamp-systimestamp from dual;它返回0。这一个取而代之的是从dual中选择systimestamp-(systimestamp-1);返回+01 00:00:00.762611。答案后面的差值应该是1天(没有毫秒)…@FrancescoSerra-这是因为减去1(意味着一天)是一个
日期
操作。时间戳被强制转换为日期(意味着时间戳中的一秒小数被截断掉)。与其减去1,不如减去
interval'1'day
——从时间戳中减去interval将返回时间戳,并且不涉及舍入或截断。您将看到结果正好是1天。可能值得注意的是,PL/SQL代码并非如此,它将在每次调用systimestamp时重新计算systimestamp,正如我在中所演示的那样。@JonHeller-好的一点,我将在我的答案中添加一些内容,以提醒读者这一点。PL/SQL的行为不同是有道理的;它是一种过程语言,在过程语言中没有“读取一致性”的概念。在你的另一篇文章中,人们可能会错误地认为“过程”和“函数”之间的区别,因为函数可以从SQL调用,但过程不能。实际上,可以从PL/SQL代码中调用函数,在这种情况下,也不会有“读取一致性”。@mathguy好的一点,我更新了我的答案,试图让它更清晰。谢谢