Oracle:我如何才能从昨天开始选择记录?

Kei*_*ers 39 sql database oracle plsql

我花了几个小时在网上搜索这个问题的答案......

这是我现在拥有的:

select  *
from    order_header oh
where   tran_date = sysdate-1
Run Code Online (Sandbox Code Playgroud)

提前致谢.

OMG*_*ies 70

使用:

AND oh.tran_date BETWEEN TRUNC(SYSDATE - 1) AND TRUNC(SYSDATE) - 1/86400
Run Code Online (Sandbox Code Playgroud)

参考:TRUNC

调用函数tran_date意味着优化器将无法使用与之关联的索引(假设存在一个索引).某些数据库(如Oracle)支持基于函数的索引,这些索引允许对数据执行函数以最大限度地减少对此类情况的影响,但IME DBA不允许这些.我同意 - 在这种情况下他们并不是真的必要.

  • 一个小警告 - 你可能需要从上限减去1秒.否则,如果您有一个今天午夜的TRAN_DATE,它将在查询中返回昨天插入的行.我不希望这是理想的行为. (4认同)

Hen*_*Gao 17

trunc(tran_date) = trunc(sysdate -1)
Run Code Online (Sandbox Code Playgroud)

  • 如果我假设这个查询所依赖的tran_date上有一个索引,那么在索引列上调用一个函数就会大大降低查询的性能. (3认同)