2012-01-16 138 views
0

我想在幾個月內分割日期範圍。我將通過開始日期(1-jan-2011)和結束日期(31-dec-2011)作爲參數,那麼它必須返回結果一樣按月分割日期範圍SQL Server

1-jan-2011 - 31-jan-2011 
1-feb-2011 - 28-feb-2011 
1-mar-2011 - 31-mar-2011 

請給我一個存儲過程.....

感謝, 阿布舍克

+5

「請給我一個存儲過程」 - 你嘗試過什麼? – 2012-01-16 09:39:31

回答

3

試試這個:

CREATE PROC SplitDateRange 
    @from DATETIME, 
    @to DATETIME 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SET @from = CONVERT(VARCHAR, DATEADD(DAY, -DATEPART(DAY, @from)+1, @from), 112) 

    -- Sql 2000 

    CREATE TABLE #temp (DateFrom DATETIME, DateTo DATETIME) 
    WHILE @from < @to 
    BEGIN 
     INSERT #temp VALUES (@from, DATEADD(DAY, -1, DATEADD(MONTH, 1, @from))) 
     SET @from = DATEADD(MONTH, 1, @from) 
    END 

    SELECT * FROM #temp 
    DROP TABLE #temp 


    --sql 2005+ 
    /* 
    ;WITH Ranges(DateFrom, DateTo) AS 
    (
     SELECT @from DateFrom, DATEADD(DAY, -1, DATEADD(MONTH, 1, @from)) DateTo 
     UNION ALL 
     SELECT DATEADD(MONTH, 1, DateFrom), DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(MONTH, 1, DateFrom))) 
     FROM Ranges 
     WHERE DateFrom < DATEADD(MONTH, -1, @To) 
    ) 
    SELECT * FROM Ranges 
    OPTION(MAXRECURSION 0) 
    */ 
END 
GO 
EXEC SplitDateRange '2011-01-02', '2012-06-06' 
+0

+1的確如此。 – 2012-01-16 10:05:23

+0

嘿Thanx奧列格。它的工作。 – user1151551 2012-01-16 10:19:00

+1

如果它正在工作,請接受oleg – 2012-01-16 11:16:55

0

這樣就可以在另一個SQL查詢使用結果(我認爲這是你要去的地方)我會把它放到一個表值函數中。

假設的SQL Server 2005 +,你可以使用這個...

CREATE FUNCTION dbo.ufnMonthlyIntervals(
        @from_date SMALLDATETIME, 
        @end_date SMALLDATETIME 
) 
RETURNS TABLE 
WITH 
    intervals (
    from_date, 
    end_date 
) 
AS 
(
    SELECT @from_date, DATEADD(MONTH, 1, @from_date ) - 1 
    UNION ALL 
    SELECT end_date + 1, DATEADD(MONTH, 1, end_date + 1) - 1 FROM intervals WHERE end_date < @end_date 
) 
RETURN 
    SELECT 
    from_date, 
    CASE WHEN end_date > @end_date THEN @end_date ELSE end_date END AS end_date 
    FROM 
    intervals 

然後你只需要使用SELECT * FROM dbo.ufnMonthlyIntervals('20110101', '20111201') AS intervals

+0

@AndriyM的回答+1請參閱http://msdn.microsoft.com/en-us/library/ms186755.aspx中的第二個示例,作爲我的語法的參考。 – MatBailie 2012-01-18 09:47:55

+0

是的,我看到如果沒有引起足夠的重視,它會如何誤導。 :)'RETURNS TABLE'和'[AS] RETURN'之間的'WITH'子句是** not **關於CTE定義。 – 2012-01-18 12:37:42