我需要运行查询,我需要在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'
那么如何优化非硬编码的查询呢?
答案 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')
是否能解决您的性能问题是另一回事......