2011-03-24 166 views
5

我有一個表單,用戶在其中提取報表。 在表單中,他們可以選擇開始日期和結束日期,或者通過兩個值的空值。如果他們選擇null,則返回所有記錄EFFECTIVEDATE < GETDATE()CASE語句似乎那裏 並不像之間,也沒有像「<」運營商在SQL CASE中使用BETWEEN where子句

這裏是我的腳本

SELECT * FROM tbReport 
WHERE 
    EffectiveDate 
    CASE 
     WHEN (@StartDate IS NOT NULL AND @EndDate IS NOT NULL) 
     THEN BETWEEN (@StartDate AND @EndDate)   
     ELSE 
        THEN < GETDATE() 

    END 

回答

7

你可以重寫它沒有的情況下,如:

SELECT * 
FROM tbReport 
WHERE (
      @StartDate is not null 
      and 
      @EndDate is not null 
      and 
      EffectiveDate between @StartDate AND @EndDate 
     ) 
     or 
     (
      (
       @StartDate is null 
       or 
       @EndDate is null 
      ) 
      and 
      EffectiveDate < getdate() 
     ) 
+0

感謝這個答案對我最有意義,並考慮到所有條件。 – MeltdownZA 2011-03-24 09:26:13

+0

它可以工作,但是對於需要什麼而言它並不複雜?從可維護性的角度來看,這不是我的第一選擇。 – SecretDeveloper 2011-03-24 11:05:38

0

您的CASE語法都錯了這裏..試試這個:

SELECT * FROM tbReport 
WHERE 
    (@StartDate is null and @EndDate is null and EffectiveDate < GetDate()) or 
    (@StartDate is not null and @EndDate is not null and 
    EffectiveDate >= @StartDate and EffectiveDate <= @EndDate) 
+0

雖然這是一個非常好的選擇..你應該把第一個@startdate和@enddate(@StartDate爲空或@EndDate爲空)和EffectiveDate 2011-03-24 09:09:53

2

假設這是SQL Server,您可以通過使用ISNULL簡化這個:

select * 
from tbReport 
where EffectiveDate between isnull(@StartDate, '1 Jan 1990') 
     and isnull(@EndDate, getdate()) 
+0

+1可能是OP的意思和非常簡潔 – Andomar 2011-03-24 08:55:11

+0

不幸的是,如果任何一個日期爲空,則返回所有記錄where有效日期 MeltdownZA 2011-03-24 09:01:08

+0

是的如果你拿出BETWEEN並使用AND代替當任何參數爲空時處理。看看我的答案,看看我的意思。 – SecretDeveloper 2011-03-24 09:15:21

2

像這樣的事情應該工作,我還沒有檢查語法是正確的,但。

SELECT * FROM tbReport 
WHERE EffectiveDate < IsNull(@EndDate,GetDate()) 
AND EffectiveDate > IsNull(@StartDate,'01/01/1979') 
0

SQL語句寫入不正確。案例不會有條件地選擇評估的代碼。您可以將該案例看作一個值,因此您必須在案例和其他操作數之間放置一個操作符。

一個寫這將是的多種方式:

where 
case when @StartDate IS NOT NULL AND @EndDate IS NOT NULL and EffectiveDate BETWEEN (@StartDate AND @EndDate) then 1 
case when (@StartDate IS NULL OR @EndDate IS NULL) and EffectiveDate <getdate() then 1 
else 0 end = 1 

如果你不想用它寫的情況下,你可以選擇之前的解決方案之一,但他們使用的分立起始日期。