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

3

我有两个日期,分别是'2011-01-23''2015-11-29'

  • '2011-01-23'是2011年第一季度,因此为'Jan 2011'

  • '2015-11-29'是2015年第四季度,因此为'Oct 2015'

在SQL Server中,我想要在选择列表中获取所有的季度。例如:

输入:@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个回答

7
您可以使用递归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来生成输出字符串,但我没有进行过太多实验,所以我会把它留作练习...

非常感谢你,Damien。我在网上找到了同样的解决方案。 - Amit Mishra

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)

我正在寻找MySQL中相同的函数,你能帮我吗? - Ahmed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接