我有两个日期说'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
答案 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)