利用SQL datepart来识别连续的时间段

时间:2012-10-19 17:01:39

标签: sql-server

我有一个正常工作的存储过程,但不理解它为什么起作用的理论。我通过利用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 +月份增加?为什么我们会增加一年?后端发生了什么?

1 个答案:

答案 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