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 是日期类型并且列已编入索引,这可能会导致性能差异。在那种情况下,与日期进行比较可能会使用索引,而与时间戳进行比较则不会。
我想了解两者的区别
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 是日期类型并且列已编入索引,这可能会导致性能差异。在那种情况下,与日期进行比较可能会使用索引,而与时间戳进行比较则不会。