【问题标题】:comparing dates (with between) using TO_DATE vs TRUNC() or other efficient methods使用 TO_DATE vs TRUNC() 或其他有效方法比较日期(之间)
【发布时间】:2019-09-03 16:02:41
【问题描述】:

我在一个字段 (outcomes_date) 中有一个日期,由于 ETL 过程,该日期实际上是一个零日期,因此它显示为 01JUN2019:00:00:00 - 其他两个字段(admdt 和 disdt)有时间戳-

如果不使用 trunc 函数,我可能会错过一些 admdt 与结果日期相同的条目。

据这里的另一位开发人员说,trunc 的处理成本很高,但我读到我也不应该 to_Date 日期。

感谢任何有关效率的提示。

即 trunc(admdt) 和 trunc(disdt) 之间的 trunc(outcome_date)

【问题讨论】:

  • 我在使用 trunc 时从未遇到过性能问题。应该没问题。

标签: sql oracle


【解决方案1】:

并不是TRUNC() 很贵。也就是说,如果“X”列被索引,那么该列上的任何函数(TRUNC() 或其他)都会阻止 Oracle 使用该索引。

因此,除非您想在表达式 TRUNC(outcome_date) 上创建基于函数的索引,否则最好不要使用 TRUNC()

另一种选择:

WHERE outcome_date BETWEEN trunc(admdt) and trunc(disdt)+1-INTERVAL `1` SECOND

【讨论】:

  • 感谢 Oracle 如何使用或不使用带有 trunc 的索引。如果 admdt 和 disdt 被编入索引(尽管它们可能是)outcome_date 不是,那么在这些 admdt 和 disdt vars 上使用 trunc 会受到影响-谢谢
  • 关于 SO 的问题通常是从“真实”问题中简化/抽象出来的,所以我一般回答。在您的实际情况中,如果 outcome_dateadmdtdisdt 都是来自同一个表的真正列,那么除非您完全采用不同的索引方法(例如,函数-基于日期之间的间隔的某些表达式的索引)。
  • 好的,谢谢。结果日期来自我动态生成的另一个表与其他两个变量。该建议有所帮助,因为它将时间从约 10 分钟缩短到约 2 分钟的 1/5!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多