我正在处理一个存储过程,其中我将行数除以在指定日期范围内重复的月份和日期的间隔。
间隔月和日= 4月7日和10月8日
示例 对于日期范围2014/01/01和2014/12/31,4月7日和10月8日重复2次,因此我将我的陈述除以2。
对于日期范围2014/01/01和2015/09/01,4月7日到了10月2日和8日,所以我将我的陈述除以3。
答案 0 :(得分:2)
正如其他人所说,这个问题有点不清楚,但我相信我知道你在做什么。您试图找到一组日期(仅考虑月/日)在一系列日期(由@StartDate
和@EndDate
设置)上发生的次数。我认为问题的select count(*) from TableName
部分是分散注意力的,因为你已经知道如何做到这一点。下面是关于如何获得分母的答案,这就是你想要弄清楚如何做的。
declare @StartDate date = '2014-01-01'
, @EndDate date = '2014-12-31'
, @DenVal int --Denominator Value
create table #dates_of_interest
(
month_nbr tinyint not null
, day_nbr tinyint not null
)
insert into #dates_of_interest
values (4, 7) --7th of April
, (10, 8) --8th of October
; with date_list as
(
--use a Recursive CTE to generate a list of all the dates in the given range.
select @StartDate as dt
union all
select dateadd(d,1,dt) as dt
from date_list
where 1=1
and dt < @EndDate
)
--Get the output of the Recursive CTE along with Month/Day numbes
select dt
, datepart(m,dt) as month_nbr
, datepart(d,dt) as day_nbr
into #list_of_dates
from date_list as dl
option (maxrecursion 32767) --set to max possible levels of recursion (might want to lower this number)
--Set the Denominator to the results of the sum(case/when) AKA countif
set @DenVal =
(
select sum(case when di.month_nbr is null and di.day_nbr is null then 0 else 1 end)
from #list_of_dates as ld
left join #dates_of_interest as di on ld.month_nbr = di.month_nbr
and ld.day_nbr = di.day_nbr
)
Print @DenVal
2014年1月1日 - 2014年12月31日和2015年1月1日 - 2015年9月1日的两个例子分别得出了2和3的预期结果。可能还有其他方法可以实现这一点,但我认为Recursive CTE是最佳选择。