内部日期查询效率低下

时间:2016-06-20 11:33:18

标签: sql oracle

我需要运行查询,我需要在where子句中添加日期范围。它不应该硬编码因此我使用它如下。但它需要比硬编码版本更长的时间。

tbl1.date >= ( SELECT 
   trunc( (ADD_MONTHS(SYSDATE, -1)), 'MM')
  from dual) and tbl1.date <= ( SELECT 
   last_day( (ADD_MONTHS(SYSDATE, -1)))
  from dual)

与硬编码日期相同的查询需要更短的时间

tbl1.date >= '16/05/01' and tbl1.date <= '16/05/31'

那么如何优化非硬编码的查询呢?

1 个答案:

答案 0 :(得分:3)

您不需要使用子查询:

tbl1.date >= trunc(ADD_MONTHS(SYSDATE, -1), 'MM')
and tbl1.date <= last_day(ADD_MONTHS(SYSDATE, -1))

或(虽然我不喜欢这个带日期的结构,因为它很容易忽略时间部分):

tbl1.date between trunc(ADD_MONTHS(SYSDATE, -1), 'MM')
    and last_day(ADD_MONTHS(SYSDATE, -1))

或者,如果您的日期列的值不是午夜:

tbl1.date >= trunc(ADD_MONTHS(SYSDATE, -1), 'MM')
and tbl1.date < trunc(SYSDATE, 'MM')

是否能解决您的性能问题是另一回事......