2013-12-17 46 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

相關問題