【问题标题】:Date Diff- TSQL # months in each year between datesDatediff- SQL # 日期之间每年的月数
【发布时间】:2014-10-02 05:24:22
【问题描述】:

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

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

输出:

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

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

编辑:对于 2000-2014 之间的日期跨度,您确实必须有 14 年的列。但是,不太可能需要添加超过 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]

【问题讨论】:

标签: sql tsql date datediff


【解决方案1】:

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

外部查询组用于转置数据以匹配您想要列中月差的要求...

内部查询 Q3 将在没有日期范围限制的行中提供相同的结果(实际上存在限制,即 2048 年,由于主表 master..spt_values 我猜你不会达到)。

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

【讨论】:

  • 非常好!太感谢了。看起来很优雅,我可以使用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
相关资源
最近更新 更多