Oracle SQL如何精准获取昨日全量无遗漏记录?
最优Oracle SQL获取昨日全量记录方案
先给结论:你给出的第一种写法就是最优方案,完全能确保获取昨日所有记录且无遗漏:
and fch_date >= TRUNC(SYSDATE - 1) and fch_date < TRUNC(SYSDATE)
为什么这个写法最优?
- 兼容性拉满:不管
fch_date是DATE类型(精确到秒)还是TIMESTAMP类型(支持小数秒),这个条件都能覆盖所有昨日的时间范围——从昨日00:00:00.000到今日00:00:00.000之前的所有记录,不会漏掉任何带小数秒的TIMESTAMP数据。 - 性能友好:
TRUNC(SYSDATE -1)和TRUNC(SYSDATE)都是常量计算,不会触发全表扫描(只要fch_date上建有普通索引)。
说说第二种写法的问题
and fch_date BETWEEN TRUNC(SYSDATE - 1) and trunc(sysdate) - interval '1' SECOND
这个写法存在遗漏风险:如果fch_date是TIMESTAMP类型,它会漏掉昨日23:59:59.001到23:59:59.999之间的记录,因为trunc(sysdate) - interval '1' SECOND的结果是昨日23:59:59(精确到秒),而TIMESTAMP的小数秒部分不会被包含在BETWEEN范围内。
额外补充
如果你的业务场景中fch_date确实是DATE类型(无小数秒),两种写法结果一致,但第一种写法更简洁通用,没必要用第二种。
内容的提问来源于stack exchange,提问作者antoine_mc1
相关产品推荐
相关产品推荐

