按季度返回日期?

时间:2013-03-20 13:58:12

标签: sql

我正在寻找一个可以返回一系列四分之一长的日期范围的查询。

例如,如果输入是2/1/2013和3/31/2014,那么输出将如下所示:

start     end
2/1/2013  4/30/2013
5/1/2013  7/31/2013
8/1/2013  10/31/2013
11/1/2013 1/31/2014
2/1/2014  3/31/2014

请注意,上一季度只有2个月。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

只是想补充一点,这是我做了一些谷歌搜索之后所做的。我在考虑一些更有效的方法,但我认为这足以达到我的目的。第一部分是填充日期表,第二部分是计算四分之一范围。

DECLARE @StartDate SMALLDATETIME
DECLARE @EndDate SMALLDATETIME

SET @StartDate = '1/1/2011'
SET @EndDate = '12/31/2011'

-- creates a date table, not needed if there is one already
DECLARE @date TABLE ( [date] SMALLDATETIME )

DECLARE @offset INT
SET @offset = 0

WHILE ( @offset < DATEDIFF(dd, @StartDate, DATEADD(dd, 1, @EndDate)) ) 
    BEGIN
        INSERT  INTO @date ( [date] )
    VALUES  ( DATEADD(dd, @offset, @StartDate) )
    SELECT  @offset = @offset + 1
END ;

WITH    dateCTE
      AS ( SELECT   ROW_NUMBER() OVER ( ORDER BY [date] ASC ) AS qID ,
                    [date] AS qStart ,
                    CASE WHEN DATEADD(dd, -1, DATEADD(q, 1, [date])) > @EndDate
                         THEN @EndDate
                         ELSE DATEADD(dd, -1, DATEADD(q, 1, [date]))
                    END AS qEnd
           FROM     @date
           WHERE    [date] = @StartDate
                    OR ( DATEDIFF(mm, @StartDate, [date]) % 3 = 0
                         AND DATEPART(dd, [date]) = DATEPART(dd,
                                                          @StartDate)
                       )
         )