Get the same result when trying to find different data

I can get date range data 15/02 - 21/06 every year from the query below.

 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) 

But the problem is that when I want to find the year 2010 - 2012 , I get the same result.

The range I want to get is:

 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 

Who can help me?

+1
source share
1 answer

The problem is the lack of brackets: in SQL AND takes precedence over OR , so you need to put brackets around your entire previous expression:

 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 

Without brackets you get A or B or (C and D) , but you want (A or B or C) and D

+3
source

Source: https://habr.com/ru/post/922792/


All Articles