2015-01-25 2 views
1

Когда я запускаю ниже запрос, он возвращает все результаты для дат, попадающих в Date_add (CURDATE() AND CURDATE(), interval 30 day), но не включает в себя результаты для Date_sub (CURDATE() AND CURDATE(), interval 15 day)MySql Дата запроса Неправильный результат

Я знаю, что существуют данные, когда я запрос с точным пунктом deadline = '2015-01-15'

Что может быть неправильным?

SELECT bug_id, 
     bug_status, 
     resolution, 
     short_desc, 
     deadline 
FROM bugs 
WHERE bug_status IN ('RESOLVED') 
     AND deadline BETWEEN Curdate() AND Date_add(Curdate(), interval 30 day) 
     OR deadline BETWEEN Curdate() AND Date_sub(Curdate(), interval 15 day) 
+0

Side Примечание: в зависимости от типа вовлеченных (то есть, если 'deadline' отметка времени с долей секунды), вы, вероятно, [хотите, чтобы избежать использования' BETWEEN' в любом случае ] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx). (Это больше, чем просто проблема SQL Server - это действительно относится ко всем позитивным типам смежных диапазонов из-за того, как представлены числа) –

ответ

2

Приказ по телефону between. Таким образом, второй between неверен. Кроме того, вы, вероятно, хотите круглые скобки:

WHERE bug_status IN ('RESOLVED') AND 
     (deadline BETWEEN Curdate() AND Date_add(Curdate(), interval 30 day) OR 
     deadline BETWEEN Date_sub(Curdate(), interval 15 day) AND Curdate() 
     ) 

Я имею в виду, вы не могли бы хотеть круглые скобки, поэтому запрос будет таким:

WHERE (bug_status IN ('RESOLVED') AND 
     deadline BETWEEN Curdate() AND Date_add(Curdate(), interval 30 day) 
     ) OR 
     deadline BETWEEN Date_sub(Curdate(), interval 15 day) AND Curdate() 

В этом случае скобки являются излишними, но они уточнить логика.

1

between аргументы должны всегда быть value BETWEEN low AND high. Если вы переверните low и high, он вернется false. Кроме того, вы можете объединить оба условия к одному:

deadline BETWEEN Date_sub(Curdate(), interval 15 day) AND 
       Date_add(Curdate(), interval 30 day) 
Смежные вопросы