Oracle 间隔 1 天

Oracle Interval 1 day

我想了解两者的区别

someDate >= (CURRENT_TIMESTAMP - INTERVAL '1' DAY) 

someDate >= (CURRENT_TIMESTAMP - 1)

因为对我来说似乎一样,但第二个似乎有更好的性能。

主要区别在于 CURRENT_TIMESTAMP - 1 依赖于 Oracle 对 DATE 数据类型执行算术运算并派生新日期的能力,这是(某些)其他数据库不支持的能力。

CURRENT_TIMESTAMP - INTERVAL '1' DAY 使用区间数据类型来实现相同的目的。这是标准语法并得到广泛支持。

我认为任何感知到的性能优势都是一种错觉,可能是由 "warm cache" 效应引起的。

还有一个次要的区别。在第二种情况下使用算术会导致隐式数据转换,派生值是 DATE,而使用 INTERVAL 意味着第一个示例的派生值仍然是 TIMESTAMP。

select dump(current_date) as dt
       ,dump(current_timestamp) as ts 
       ,dump(current_timestamp-1) as ts_arith
       ,dump(current_timestamp - interval '1' day) as ts_invl
       ,dump(current_date - interval '1' day) as dt_invl
from dual
/

如果 SOME_DATE 是日期类型并且列已编入索引,这可能会导致性能差异。在那种情况下,与日期进行比较可能会使用索引,而与时间戳进行比较则不会。