在DATEDIFF()中编写Case语句的更好方法是?

时间:2017-08-07 18:30:45

标签: sql sql-server case datediff

我写了一个查询,查找记录处于特定状态的天数。我的查询工作正常,但我只是想知道是否有更有效的方法来编写它。我的起始数据如下所示:

   MemberID StatusDate1   StatusDate2   StatusDate3   StatusDate4
     77         2017-01-06    2017-03-30     NULL         2017-04-13
     88         NULL          NULL           2017-07-19   NULL

最终结果如下:

   MemberID  StatusDate1   StatusDate2   StatusDate3   StatusDate4
     77         83             14            NULL          116
     88        NULL            NULL            19          NULL

问题是如果有一个NULL状态日期,那么我需要找到下一个填充日期并使用它。我正在使用Case语句进行计算,虽然它确实有效,但我一直认为必须有比我编写它更好的方法:

    Select *, DATEDIFF(dd, StatusDate1, case when StatusDate2 is not null then StatusDate2,
                                             when StatusDate2 is null then StatusDate3,
                                             when StatusDate3 is not null then StatusDate3,
                                             when StatusDate3 is null then StatusDate4,
                                             when StatusDate4 is null then getdate())end) as NewStatusDate1

我正在为所有4个状态日期写这个。有没有更简单的方法来写这个?

3 个答案:

答案 0 :(得分:1)

我不知道它是否更有效率,但这绝对更容易写和阅读:

SELECT *,
       DATEDIFF(day, StatusDate1, 
                COALESCE(StatusDate2, StatusDate3, StatusDate4, GETDATE()
               ) as NewStatusDate1

我不确定为什么要将整数调用为“新状态日期”。您确定不想要DATEADD()吗?

答案 1 :(得分:1)

作为附注,请注意,约会对象和边界交叉点的确定,而不是间隔的长度。

及时采取以下两点:

1月1日23:59

1月2日00:01

在这种情况下,这段时间是两分钟。

根据您的需要,是否应将其视为一天?

Datediff将返回1(当您使用dd或等效物时),因为第2个日期的日期部分比第1个日期多一个。

如果你的数据类型比简单的日期更精确,而你想要它被舍入 - 例如超过12小时被认为是一天 - 你需要稍微不同的方法(例如,差异分钟,然后除以得到日子)

答案 2 :(得分:0)

案例将取得第一个真实结果。你拥有它的方式,你永远不会得到StatusDate4或GetDate,因为StatusDate2总是会在前两个测试之一中返回(NOT NULL或NULL)。

您可以使用以下方法简化案例陈述:

CASE
    WHEN StatusDate2 IS NOT NULL THEN StatusDate2
    WHEN StatusDate3 IS NOT NULL THEN StatusDate3
    WHEN StatusDate4 IS NOT NULL THEN StatusDate4
    ELSE GETDATE()
END