计算日期在2个日期之间出现的次数。的SQL

时间:2019-02-12 17:01:56

标签: sql tsql sql-server-2008-r2

我对于存储在数据库中的各种项目有2个日期,例如(dd-mm-yyyy):

ItemID|Date Arrived|Date Left
1     |01-02-1985  |01-06-2000
2     |01-02-1985  |01-04-2000

这些物品应该每年在同一日期进行测试,比方说5月4日。

我的预期输出应该是:

Item|NumInspections
1   |16
2   |15

第2项检查较少的原因是它在5月的检查日期之前的4月1日离开。

这在SQL中有一种方法可以产生一个整数,以显示5月4日在这两个日期之间出现的次数?

如果我使用DateDiff,则项目1的出现次数会减少一次,因为有15年4个月的时间,这意味着我错过了一次。

如果我总是将它取整,那么对于项目2,我将获得一个额外的收益,因为它是15年,即2个月,它将舍入为16。这是错误的,因为第二个日期早于检查日期。

有帮助吗?

1 个答案:

答案 0 :(得分:1)

我相信这种逻辑可以满足您的需求:

select (year(d2) - year(d1) +
        (case when d1 > datefromparts(year(d1), 5, 4) and d2 < datefromparts(year(d2), 5, 4) then -1
              when d1 <= datefromparts(year(d1), 5, 4) and d2 >= datefromparts(year(d2), 5, 4) then 1
              else 0
         end)
        ) as num_days
from (values (convert(date, '01-02-1985'),  convert(date, '01-06-2000'))) v(d1, d2);

这个想法是,如果恰好一年过去了,那么日期就会出现一次。 case然后处理“极值”,即当两个年份的任一年都为5月4日,或者两个年份都没有。