2012-08-15 19 views
1

我可以從下面的查詢中獲得每年的15/02 - 21/06日期範圍數據。嘗試查找不同的數據時得到相同的結果

SELECT * FROM dim_date 
WHERE EXTRACT (MONTH FROM date_cal) BETWEEN 3 AND 5 
OR (EXTRACT (MONTH FROM date_cal) = 2 AND EXTRACT (DAY FROM date_cal) >= 15) 
OR (EXTRACT (MONTH FROM date_cal) = 6 AND EXTRACT (DAY FROM date_cal) <= 21) 

但問題是,當我想從去年2010 - 2012找到,我回來了相同的結果。

範圍,我想:

2010-02-15 - 2010-06-15 
2011-02-15 - 2011-06-15 
2012-02-15 - 2012-06-15 

SELECT * FROM dim_date 
WHERE EXTRACT (MONTH FROM date_cal) BETWEEN 3 AND 5 
OR (EXTRACT (MONTH FROM date_cal) = 2 AND EXTRACT (DAY FROM date_cal) >= 15) 
OR (EXTRACT (MONTH FROM date_cal) = 6 AND EXTRACT (DAY FROM date_cal) <= 21) 
AND EXTRACT (YEAR FROM date_cal) BETWEEN 2010 AND 2012 

誰能幫我這個!

+0

考慮[後續問題與更多答案](http://stackoverflow.com/q/11944762/939860)。 [與這個主題相關的更多問題](http://stackoverflow.com/questions/15169410/how-do-you-do-date-math-that-ignores-the-year/15179731)。 – 2013-05-02 23:32:27

回答

3

你的問題是缺乏括號:在SQL AND優先OR,所以你需要把周圍的整個前一個表達式括號:

SELECT * FROM dim_date 
WHERE (-- added bracket 
EXTRACT (MONTH FROM date_cal) BETWEEN 3 AND 5 
OR (EXTRACT (MONTH FROM date_cal) = 2 AND EXTRACT (DAY FROM date_cal) >= 15) 
OR (EXTRACT (MONTH FROM date_cal) = 6 AND EXTRACT (DAY FROM date_cal) <= 21) 
) -- added bracket 
AND EXTRACT (YEAR FROM date_cal) BETWEEN 2010 AND 2012 

如果沒有括號,你A or B or (C and D),但你要(A or B or C) and D

+0

@ muistooshort嗯,是的。謝謝。編輯。 – Bohemian 2012-08-15 04:00:26