SQL - 在Where子句中使用Case语句提取计算日期字段

时间:2017-03-08 19:51:38

标签: sql sql-server date case

我有一个表格,存储有关项目的一系列信息。项目具有ID,状态以及项目达到特定状态的日期。

我关注两种状态:关闭和完成。因此,项目表中有两个日期字段,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子句(或其他日期计算功能)中使用相应的日期字段?

1 个答案:

答案 0 :(得分:2)

要在date_closed不为空时使用date_completed,在date_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())) ) 进行检查:

{{1}}