计算一个日期出现在两个日期之间的次数。 SQL
Count the number of times a date appears between 2 dates. SQL
我有 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。那是不正确的,因为第二个日期在检查日期之前。
有什么帮助吗?
我相信这个逻辑可以满足您的需求:
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
然后处理 "extremes" -- 当两个年份都有 5 月 4 日或两个年份都没有时。
我有 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。那是不正确的,因为第二个日期在检查日期之前。
有什么帮助吗?
我相信这个逻辑可以满足您的需求:
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
然后处理 "extremes" -- 当两个年份都有 5 月 4 日或两个年份都没有时。