日期Diff-TSQL#日期之间每年的月数

时间:2014-08-08 16:54:53

标签: sql tsql date datediff

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

例如: 开课日期= 2014年1月1日 结束日期= 3/1/2016

输出:

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

这将是一个包含许多日期(具有不同年份)的列表

编辑:你确实必须拥有14年的专栏,其日期跨度在2000年至2014年之间。但是,不太可能需要添加超过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]

关于这个的任何想法?

我是SQL的新手,只能通过以下代码获得两者之间的总月份:

select 
datediff(MONTH,[begin date], [end date]) 
from [tableofdates]

1 个答案:

答案 0 :(得分:1)

使用下面的Query,您需要在下面的示例中使用您的表代替mydates表。我使用了最大10年的差异(由列Y1,Y2 ... Y10表示)。

使用外部查询组来转置数据以符合您的要求,您希望列中的月份差异...

内部查询Q3将在行中提供相同的结果,对日期范围没有限制(实际上存在限制,即由于主表master..spt_values而导致的2048年,我猜您将无法访问)。

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