Получите тот же результат при попытке найти разные данные

Я могу получить данные о диапазоне дат 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

Кто может помочь мне в этом!


person tommy5115    schedule 15.08.2012    source источник


Ответы (1)


Ваша проблема заключается в отсутствии скобок: в 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

person Bohemian♦    schedule 15.08.2012