何时在Oracle查询中生成systimestamp函数的返回值?返回的值与查询提交或结束的时刻有关?如果在子查询中使用该函数?
谢谢!
发布于 2017-11-03 17:47:59
注意事项:下面讨论的是仅针对的SQL 。在与Oracle相关联的过程编程语言PL/SQL中,sysdate和systimestamp的行为不同。请参阅乔恩·海勒在下面的评论,以及他在评论中提供的链接。备注结尾
systimestamp是在执行查询的开始时计算一次的。它将在查询及其所有子查询中具有相同的值,无论查询中引用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)返回类似于+01 00:00:00.762611的东西。这是出乎意料的。所以让我们解释一下。
使用数字的日期算术(如1表示某一天)是用于date数据类型的表达式,而不是时间戳。因此,对于操作systimestamp - 1,时间戳首先被截断--只保留整秒,小数点之后的秒数被丢弃。
然后,对于类型为时间戳日期的操作,Oracle将首先将日期转换为时间戳,然后取差异并返回间隔。这就是OP看到的。秒的分数是由于systimestamp - 1计算的截断造成的,而第一个systimestamp不是截断的。
为了得到相同的计算“完成正确”(并确保结果确实将是+01 00:00:00.000000),我们必须使用正确的数据类型,当我们从systimestamp中减去一天。也就是说,就像数字是日期算法的“我们应该使用的东西”一样,对于时间戳算法,我们必须使用interval数据类型。
select systimestamp - (systimestamp - interval '1' day) from dual将始终准确地返回+01 00:00:00.000000。
https://stackoverflow.com/questions/47101555
复制相似问题