我想在幾個月內分割日期範圍。我將通過開始日期(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
請給我一個存儲過程.....
感謝, 阿布舍克
我想在幾個月內分割日期範圍。我將通過開始日期(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
請給我一個存儲過程.....
感謝, 阿布舍克
試試這個:
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'
+1的確如此。 – 2012-01-16 10:05:23
嘿Thanx奧列格。它的工作。 – user1151551 2012-01-16 10:19:00
如果它正在工作,請接受oleg – 2012-01-16 11:16:55
這樣就可以在另一個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
@AndriyM的回答+1請參閱http://msdn.microsoft.com/en-us/library/ms186755.aspx中的第二個示例,作爲我的語法的參考。 – MatBailie 2012-01-18 09:47:55
是的,我看到如果沒有引起足夠的重視,它會如何誤導。 :)'RETURNS TABLE'和'[AS] RETURN'之間的'WITH'子句是** not **關於CTE定義。 – 2012-01-18 12:37:42
「請給我一個存儲過程」 - 你嘗試過什麼? – 2012-01-16 09:39:31