2017-03-08 36 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

只是我的宠物狗:) –