我对于存储在数据库中的各种项目有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。这是错误的,因为第二个日期早于检查日期。
有帮助吗?
答案 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日,或者两个年份都没有。