2017-03-08 45 views
1

我有一個表存儲一系列項目信息。項目具有ID,狀態以及項目達到特定狀態的日期。SQL - 使用Case語句在Where子句中提取計算日期字段

我關心兩種狀態:關閉並完成。因此,項目表中有兩個日期字段,date_closed和date_completed。項目在關閉前完成。

我想要做的是獲得在過去30天內已完成或關閉的項目記錄數。因此,我需要計算date_completed字段中已完成的項目以及date_closed字段中的已關閉項目,這兩個項目都有30天的限制。

數據看起來是這樣的(今天的日期是2017年3月8日)

id | status | date_completed | date_closed 
------------------------------------------------------------------- 
1 completed March-1-2017  NULL 
2 completed Jan-1-2017  NULL 
3 closed  Dec-1-2016  March-1-2017 
4 closed  Dec-1-2016  March-1-2017 
5 closed  Dec-1-2016  Jan-1-2017 

我在尋找的結果是數字「3」,因爲有跡象表明已完成或關閉三個項目過去30天(ID爲1,3和4)。

我知道,日期計算是一樣的東西

WHERE DATEDIFF(day, CURDATE(),date_completed/date_closed) <= 30 
然而

,我不知道如何根據項目情況來選擇合適的日期字段。我幾乎可以肯定這裏需要提供一個案例陳述,但是對於DATEDIFF的要求正在拋棄我。

如何根據每個項目的狀態在DATEDIFF子句(或其他日期計算函數)中使用適當的日期字段?

回答

2

要使用date_closed當它不爲空,且date_completeddate_closed爲空,則:

where coalesce(date_closed,date_completed) >= dateadd(day, -30, getdate()) 

或檢查基於status使用or

where (
     ([status] = 'completed' and date_completed >= dateadd(day, -30, getdate())) 
     or 
     ([status] = 'closed' and date_closed >= dateadd(day, -30, getdate())) 
    ) 
+0

當他們將發佈格式正確的日期?! +1 –

+0

@JohnCappelletti根據我迄今爲止的經驗,我的預測永遠不會。但我們可以永遠希望! [xkcd PSA ISO 8601](https://xkcd.com/1179/)。至少這裏的人不能被誤解。 'yyyy-dd-mm'是那些特別棘手的問題。特別是當他們僅在本月的前12天時。 – SqlZim

+0

只是我的寵物狗:) –