以两个日期之间的月份,年份格式获取所有季度

时间:2013-12-17 07:10:56

标签: sql-server date

我有两个日期说'2011-01-23''2015-11-29'

  • '2011-01-23'于2011年第一季度落后'Jan 2011'

  • '2015-11-29'2015年第四季度下降所以'Oct 2015'

在SQL Server中,我希望将所有季度都放在选择列表中。 e.g。

输入:@StartDate='2011-01-23' , @EndDate='2015-11-29'

输出:

Jan 2011
Apr 2011
Jul 2011
Oct 2011
Jan 2012
Apr 2012
Jul 2013
Oct 2013
Jan 2014
......
......
......
Jul 2015
Oct 2015

2 个答案:

答案 0 :(得分:6)

您可以使用递归CTE生成日期,如下所示:

declare @StartDate datetime
declare @EndDate datetime
select @StartDate='2011-01-23' , @EndDate='2015-11-29'

;With Quarters as (
    select DATEADD(quarter,DATEDIFF(quarter,0,@StartDate),0) as dt
    union all
    select DATEADD(quarter,1,dt)
    from Quarters
    where dt < DATEADD(quarter,DATEDIFF(quarter,0,@EndDate),0)
)
select
    --I'd usually keep them as dates at this point, but to match your requirement
    CONVERT(varchar(3),dt,109) + ' ' + CONVERT(varchar(4),dt,120)
from Quarters order by dt

这也使用了其他一些技巧 - 它使用CONVERT与太短的目标数据类型来快速将字符串截断为我们想要保留的部分 - 并使用DATEADD / DATEDIFF对将日期时间值快速舍入到最近的间隔边界。

对于SQL Server 2012,您可以改为使用FORMAT来生成输出字符串,但我没有尝试过这么多,所以我将其留作练习......

答案 1 :(得分:0)

最后,我找到了问题的解决方案..

WITH mycte AS
(
  SELECT CAST('2011-01-01' AS DATE) DateValue
  UNION ALL
  SELECT  DATEADD(Q,1,DateValue)    FROM    mycte  WHERE   DATEADD(Q,1,DateValue) < '2012-12-31'
)

SELECT  CONVERT(varchar(3), DATENAME(MONTH,DateValue))+ ' ' +Convert(varchar(4),DATEPART(YYYY,DateValue)) FROM  mycte OPTION (MAXRECURSION 0)