2012-11-20 38 views
0

我正在嘗試編寫一個case語句,它將根據當前系統日期篩選一系列日期。我需要的範圍從30天前到現在,30-60天前和60-120天前,全部基於系統日期。這是我沒有什麼,這是證明不成功:根據系統日期在一個case語句內的日期範圍

(case 
when a.last_active_date between sysdate and sysdate-30 then 'Inactive 30 Days or Less' 
when a.last_active_date between sysdate-30 and sysdate-60 then 'Inactive 30-60' 
when a.last_active_date between sysdate-60 and sysdate - 120 then 'Inactive 60-120' 
else 'Inactive 120+ Days' 
end) Inactivity, 

任何建議,我應該如何處理這個?

+1

除了那些範圍重疊的事實,因爲'between'是包含性的,查詢不成功的方式是什麼? –

+0

爲什麼你在SQL中這樣做,這種事通常在應用程序層更好處理。另外,這兩個不同的標籤有什麼關係 - 哪個是RDBMS? –

+0

@MichaelFredrickson - 除了重疊,它沒有正確過濾 – Sean

回答

0

下面是在T-SQL的答案:

select a.last_active_date 
, case 
     when getutcdate() - a.last_active_date <= 30 then 'Inactive 30 Days or Less' 
     when getutcdate() - a.last_active_date <= 60 then 'Inactive 30-60' 
     when getutcdate() - a.last_active_date <= 120 then 'Inactive 60-120' 
     else 'Inactive 120+ Days' 
end Inactivity 
from @t a 
order by a.last_active_date desc 

下面的代碼來設置與測試數據上面的例子:

declare @t table (last_active_date datetime) 

insert @t select getutcdate() 
union select getutcdate()-29 
union select getutcdate()-30 
union select getutcdate()-31 
union select getutcdate()-59 
union select getutcdate()-60 
union select getutcdate()-61 
union select getutcdate()-119 
union select getutcdate()-120 
union select getutcdate()-121 

這樣做的優點是getutcdate() - a.last_active_date功能的重用應允許緩存結果,所以應該節省一些計算開銷。

+0

緩存每個'CASE'語句的結果,也許(不知道SQL Server足夠肯定地說)。緩存可索引搜索,否。不管怎麼說,你都在輸出所有的行,所以它不像其他行那麼重要。 –

+0

同意它將(可能)只被緩存每行,所以不會產生巨大的差異,但任何優化都有幫助。 – JohnLBevan