问题:两个日期之间的时间跨度。我想知道每个日期之间有多少个月。诀窍是:两个日期之间每年的月数。
例如: 开课日期= 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]
答案 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