-1

IDと開始日と終了日を持つテーブルがあります。私は別のテーブルに挿入したい、開始データと終了日とIDの間の毎月末、例えば

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
4

1 に答える 1

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
于 2012-08-29T17:43:42.400 に答える