2016-06-20 91 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