2013-03-20 126 views
0

我在尋找一個可以返回四分之一長的日期範圍的查詢。按季度返回日期範圍?

例如,如果輸入的是2013年2月1日和2014年3月31日,則輸出將如下所示:

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個月之久。提前感謝您的幫助。

+0

[你有什麼試過](http://www.whathaveyoutried.com)? – Kermit 2013-03-20 13:59:57

+0

您使用的是什麼版本的SQL? – 2013-03-20 14:04:42

+3

請通過添加適當的標記(Oracle,SQL Server,MySQL等)來指定您要定向的RDBMS。可能會有利用不被普遍支持的語言或產品功能的答案。此外,通過使用特定的RDBMS標記它,您的問題可能會得到更好的答案的人的關注。 – Taryn 2013-03-20 14:05:46

回答

0

只是想補充一點,這是我做了一些Google搜索後做的。我正在考慮一些更有效的方法,但我認爲這足以滿足我的目的。第一部分是填充日期表,第二部分是計算季度範圍。

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