我有两个日期说'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
Damien_The_U.. 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
pair快速将日期时间值向下舍入到其最近的间隔边界.
对于SQL Server 2012,您可以改为使用FORMAT
生成输出字符串,但我没有尝试过那么多,所以我将其作为练习...
您可以使用递归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
pair快速将日期时间值向下舍入到其最近的间隔边界.
对于SQL Server 2012,您可以改为使用FORMAT
生成输出字符串,但我没有尝试过那么多,所以我将其作为练习...