日期差异-日期之间每年的TSQL#个月

日期差异-日期之间每年的TSQL#个月,sql,tsql,date,datediff,Sql,Tsql,Date,Datediff,问题:两个日期之间的时间跨度。我想知道每个日期之间有多少个月。诀窍是:每年两个日期之间的月数 例如: 开始日期=2014年1月1日 截止日期=2016年3月1日 输出: 第1列:“2014”的值为12 第2列:“2015”的值为12 第3列:“2016”的值为2 这将适用于包含多个日期(不同年份)的列表 编辑:在2000年至2014年之间的日期跨度中,确实需要有14年的列。但是,不太可能需要添加超过5列 当前思路 使用下面的查询,您需要使用您的表来代替下面示例中的mydates表。我使用最大10

问题:两个日期之间的时间跨度。我想知道每个日期之间有多少个月。诀窍是:每年两个日期之间的月数

例如: 开始日期=2014年1月1日 截止日期=2016年3月1日

输出:

第1列:“2014”的值为12 第2列:“2015”的值为12 第3列:“2016”的值为2

这将适用于包含多个日期(不同年份)的列表

编辑:在2000年至2014年之间的日期跨度中,确实需要有14年的列。但是,不太可能需要添加超过5列

当前思路
使用下面的查询,您需要使用您的表来代替下面示例中的mydates表。我使用最大10年差异(由列Y1、Y2…Y10表示)

外部查询组by用于转换数据,以匹配您希望列中月差的需求

内部查询Q3将以行的形式提供相同的结果,但对日期范围没有限制(实际上,由于主表master..spt_值的限制,有2048年,我想您不会达到)


从2000年到2014年,你会有14个专栏?@Blam是的,但是很难确定是否需要超过5个专栏非常好!非常感谢你。看起来很优雅,我可以和它一起工作!!
declare @datediff as int

select
@datediff=(Datediff(MONTH,[begin date], [end date]))
from [DateRange]
select 

case 
when  @datediff <= 12 then @datediff 
when @datediff <= 24 then @datediff -12 
when @datediff <= 36 then @datediff -24
when @datediff <= 48 then @datediff -36
else NULL 
end
from [DateRange]
select 
datediff(MONTH,[begin date], [end date]) 
from [tableofdates]
select 
Q3.begindt,
Q3.enddt,
Q3.Diff_in_Year,
sum(Case when Q3.Year_Counter = 0 Then datediff(mm,Q3.y_start,Q3.y_end)+1 else 0 end) Y1,
sum(Case when Q3.Year_Counter = 1 Then datediff(mm,Q3.y_start,Q3.y_end)+1 else 0 end) Y2,
sum(Case when Q3.Year_Counter = 2 Then datediff(mm,Q3.y_start,Q3.y_end)+1 else 0 end) Y3,
sum(Case when Q3.Year_Counter = 3 Then datediff(mm,Q3.y_start,Q3.y_end)+1 else 0 end) Y4,
sum(Case when Q3.Year_Counter = 4 Then datediff(mm,Q3.y_start,Q3.y_end)+1 else 0 end) Y5,
sum(Case when Q3.Year_Counter = 5 Then datediff(mm,Q3.y_start,Q3.y_end)+1 else 0 end) Y6,
sum(Case when Q3.Year_Counter = 6 Then datediff(mm,Q3.y_start,Q3.y_end)+1 else 0 end) Y7,
sum(Case when Q3.Year_Counter = 7 Then datediff(mm,Q3.y_start,Q3.y_end)+1 else 0 end) Y8,
sum(Case when Q3.Year_Counter = 8 Then datediff(mm,Q3.y_start,Q3.y_end)+1 else 0 end) Y9,
sum(Case when Q3.Year_Counter = 9 Then datediff(mm,Q3.y_start,Q3.y_end)+1 else 0 end) Y10
From
(select 
Q1.begindt,
Q1.enddt,
Q1.years Diff_in_Year,
Q2.number as Year_Counter,
(Case when Q2.number = 0 then Q1.begindt else dateadd(yy, datediff(yy,0,dateadd(yy,q2.number,q1.begindt)),0)End) AS y_Start,
(case when ((Q1.years-1) = Q2.number) then Q1.enddt else DATEADD(yy, DATEDIFF(yy,0,dateadd(yy,q2.number+1,q1.begindt) + 1), -1) End) AS y_End,
Year(Q1.begindt)+Q2.number YearInYYYY
from
 (select begindt,enddt,DATEDIFF(year,begindt,enddt)+1 as years from mydates) Q1
  join master..spt_values Q2 on Q2.type = 'P' and Q2.number < Q1.years
) Q3
Group by Q3.begindt,Q3.enddt,q3.Diff_in_Year
begindt     enddt      YDif Y1  Y2  Y3  Y4  Y5  Y6  Y7  Y8  Y9  Y10
2010-07-02  2014-02-06 5    6   12  12  12  2   0   0   0   0   0
2011-01-01  2014-12-31 4    12  12  12  12  0   0   0   0   0   0
2012-05-22  2017-12-16 6    8   12  12  12  12  12  0   0   0   0