2016-06-20 64 views
1

我需要运行一个查询,我需要在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

你为什么使用子查询来获取这些值?你的日期栏还包括不是午夜的时间吗? –

+2

Alex是对的。 ((ADD_MONTHS(SYSDATE,-1)),'MM')和last_day((ADD_MONTHS(SYSDATE,-1))' –

+0

'之间的tbl1.date可以被重写,它解决了我的问题,谢谢你的帮助。 – user1474111

回答

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') 

是否能修正您的性能问题是anothe r ...

+0

谢谢,它解决了我的问题。 – user1474111