2012-08-29 58 views
-1

我有一個包含id和開始日期和結束日期的表。我想插入另一個表格,每個月的結束時間在開始數據和結束日期以及ID之間,例如T-SQL從日期範圍中獲取月份

ID Start Date End Date 
1 2012-01-01 2012-03-31 
2 2012-10-01 2012-12-31 

結果

ID MONTH END 
1 2012-01-31 
1 2012-02-29 
1 2012-03-31 
2 2012-10-31 
2 2012-11-30 
2 2012-12-31 
+0

什麼是數據庫引擎? MySQL的? SQL Server?甲骨文? – mellamokb

回答

2

這樣的回答做了一些假設 - 比啓動日期大不結束日期,但你應該看看它是如何工作的。它創建一個遞歸連接CTE並使用它來計算結束日期

CREATE TABLE #Dates 
(
    ID INT IDENTITY PRIMARY KEY, 
    START_DATE DATETIME2(0) NOT NULL, 
    END_DATE DATETIME2(0) NOT NULL 
) 

INSERT INTO #Dates VALUES ('2012-01-01', '2012-03-31'), ('2012-10-01','2012-12-31') 

WITH MONTHS ([ID],[Month],[Date], [End]) 
AS 
(
    SELECT ID, DATEPART(m,START_DATE) AS [Month], START_DATE AS [Date], DATEADD(s,-1,DATEADD(m,DATEDIFF(m,0,START_DATE)+1,0)) as [End] 
    FROM #Dates 
    UNION ALL 
    SELECT D.ID, DATEPART(m,DATEADD(m,1,[Date])),DATEADD(m,1,[Date]), DATEADD(s,-1,DATEADD(m,DATEDIFF(m,0,DATEADD(m,1,[Date]))+1,0)) as [End] 
    FROM #Dates D 
    INNER JOIN MONTHS M 
    ON D.ID = M.ID 
    WHERE DATEADD(m,1,[Date]) < [END_DATE] 
) 



SELECT * 
FROM MONTHS ORDER BY ID, Date 

DROP TABLE #Dates