2015-01-20 2 views
1

У меня есть запрос с дополнительными параметрами диапазона дат, которые я пытаюсь выработать с футляром, но борется.SQL Server CASE в выражении WHERE с daterange

  • Если обе даты NULL, вернуть все, включая NULL даты строки
  • Если оба имеет значения, возвращает только те, в диапазоне
  • Если FROM_DATE имеет значение, и to_date нуля, вернуть все> FROM_DATE
  • Если FROM_DATE имеет нулевое значение, и to_date имеет значение, вернуть все < TO_DATE

так в основном что-то вроде:

SELECT * 
FROM TABLE 
WHERE CASE WHEN (@FROM_DATE IS NOT NULL and @TO_DATE IS NOT NULL) THEN 
    DATE BETWEEN ISNULL(@FROM_DATE,1/1/1900) and ISNULL(@TO_DATE,1/1/2999) 
ELSE 
    DATE = DATE ? 

Справка была бы принята с благодарностью!

ответ

1

Это выглядит, как если бы вы решили, что даты в 1900 и 2999 не будет происходить в данных на законных основаниях, так что вы можете использовать

SELECT * 
FROM TABLE 
WHERE (@FROM_DATE IS NULL AND @TO_DATE IS NULL) 
     OR (DATE BETWEEN ISNULL(@FROM_DATE, '19000101') 
      AND ISNULL(@TO_DATE, '29990101')) 
OPTION (RECOMPILE);  
+0

Могу ли я спросить, почему Option (RECOMPILE)? – penderi

+0

@penderi http://www.sommarskog.se/dyn-search.html –

+0

СПАСИБО, это работает! Эти даты, скорее всего, будут вне сферы действия, я просто не знал о другом способе этого. Если есть что-то более эффективное, я, безусловно, буду открыт для предложений. – Jay

Смежные вопросы