2011-12-22 54 views
2

我有以下的(我知道是語法不正確的,甚至是軸承的荒謬):CASE WHEN - 我做錯了什麼?

and lp.lease_current_stop_date 
    case when @lease_expiry_period = 01 
    then 
     between dateadd(MONTH, +1, 
         getdate()) 
    else 
     between dateadd(MONTH, +2, 
         getdate()) 

我只是想知道這將是實現這一目標的最佳方式是什麼?我正在試圖做的是:

*當@lease_expiry_period等於01時,顯示所有租約將從現在開始到期一個月。當@lease_expiry_period等於02則顯示所有租約從現在到期長達兩個月。*

性能注意

值得關注的是我並沒有截斷日期在我的例子爲簡單起見也。由於這是使用月getdate()應該是:

Dateadd(d,0,datediff(d,0,getdate())) 

爲了獲得最佳性能。

回答

6
AND lp.lease_current_stop_date BETWEEN getdate() AND dateadd(MONTH, @lease_expiry_period, getdate()) 
+1

+1。好一個。我用了一個計算機案例,但沒有發佈,因爲你是整潔的。 – 2011-12-22 04:57:26

+0

很乾淨。幹得不錯! – Codingo 2011-12-22 05:58:30

+0

值得注意的是,爲了簡單起見,我並未在我的示例中截斷日期。因爲這是使用月getdate()應該也有Dateadd(d,0,datediff(d,0,getdate()))以獲得最佳性能 – Codingo 2011-12-22 06:08:55

1

如何以下

select * 
    from [table] lp 
    where lp.lease_current_stop_date= (
    select case 
     when @lease_expiry_period = 01 
     then 
      dateadd(MONTH, +1, getdate()) 
     else 
      dateadd(MONTH, +2,getdate()) 
     end) 
+1

弗朗西斯的回答實際上要簡潔得多 – 2011-12-22 05:03:32

+0

我同意並與Fancis的答案一起進行,但非常感謝您投入此時間。這也有助於我理解案件/何時更好地謝謝你! – Codingo 2011-12-22 05:59:12

1
... 
AND 'T' = CASE WHEN @lease_expiry_period IN (01, 02) THEN 
      CASE WHEN lp.lease_current_stop_date 
         BETWEEN getdate() 
         AND dateadd(MONTH, @lease_expiry_period, getdate())        
        THEN 'T' 
      END 
      END 
AND ...