2011-12-22 39 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 ...