我有两个日期说'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
Run Code Online (Sandbox Code Playgroud)
您可以使用递归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
Run Code Online (Sandbox Code Playgroud)
这也使用了一些其他技巧 - 它使用CONVERT太短的目标数据类型来快速将字符串截断为我们想要保留的部分 - 并且它使用DATEADD/ DATEDIFFpair快速将日期时间值向下舍入到其最近的间隔边界.
对于SQL Server 2012,您可以改为使用FORMAT生成输出字符串,但我没有尝试过那么多,所以我将其作为练习...
| 归档时间: |
|
| 查看次数: |
5115 次 |
| 最近记录: |