2013-12-17 36 views
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 

回答

5

您可以使用递归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以产生输出字符串,但我还没有与试验很多,所以我会离开,作为一个练习...

+0

非常感谢您Damien,我在网上找到了相同的解决方案。 –

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) 
+0

我正在寻找在mysql中的相同功能,你可以帮助我 – Ahmed

相关问题