我有一个正常工作的存储过程,但不理解它为什么起作用的理论。我通过利用datepart和密集等级(通过其他地方的帮助找到解决方案)来识别连续的一段时间。
select
c.bom
,h.x
,h.z
,datepart(year, c.bom) * 12 + datepart(month, c.bom) -- this is returning a integer value for the year and month, allowing us to increment the number by one for each month
- dense_rank() over ( partition by h.x order by datepart(year, c.bom) * 12 + datepart(month, c.bom)) as grp -- this row does a dense rank and subtracts out the integer date and rank so that consecutive months (ie consecutive integers) are grouped as the same integer
from
#c c
inner join test.vw_info_h h
on h.effective_date <= c.bom
and (h.expiration_date is null or h.expiration_date > c.bom)
理论上我理解分组功能正在发生什么。
如何将年份* 12 +月份增加?为什么我们会增加一年?后端发生了什么?
答案 0 :(得分:1)
日期的年份部分是整数值。由于一年中有12个月,因此将年份值乘以12可提供到达当年第一个月的总个月数。
这是一个例子。截止日期为2012年2月11日(20120211,CCYYMMDD格式)
2012 * 12 =从开始时间开始的24144个月。
24144 + 2个月(二月)= 24146。
将年份值乘以一年中的月数,可以建立与月份相关的偏移量,而无需进行任何编码来处理一年结束与另一年结束之间的边缘情况。例如:
2011年11月 - &gt; 24143 12/2011 - &gt; 24144 01/2012 - &gt; 24145 02/2012 - &gt; 24146