0

問題: 2 つの日付期間の間の各月の週数を列に表示します (現時点では 3 か月までで十分です)。可能であれば、当日から (動的)

私が現在いる場所:

SELECT Q3.[Begin Date]
    ,Q3.[End Date]
    ,Q3.Diff_in_Year
    ,sum(CASE 
            WHEN Q3.Year_Counter = 0
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y1
    ,sum(CASE 
            WHEN Q3.Year_Counter = 1
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y2
    ,sum(CASE 
            WHEN Q3.Year_Counter = 2
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y3
    ,sum(CASE 
            WHEN Q3.Year_Counter = 3
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y4
    ,sum(CASE 
            WHEN Q3.Year_Counter = 4
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y5
    ,sum(CASE 
            WHEN Q3.Year_Counter = 5
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y6
    ,sum(CASE 
            WHEN Q3.Year_Counter = 6
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y7
    ,sum(CASE 
            WHEN Q3.Year_Counter = 7
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y8
    ,sum(CASE 
            WHEN Q3.Year_Counter = 8
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y9
    ,sum(CASE 
            WHEN Q3.Year_Counter = 9
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y10
FROM (
    SELECT Q1.[Begin Date]
        ,Q1.[End Date]
        ,Q1.years Diff_in_Year
        ,Q2.number AS Year_Counter
        ,(
            CASE 
                WHEN Q2.number = 0
                    THEN Q1.[Begin Date]
                ELSE dateadd(yy, datediff(yy, 0, dateadd(yy, q2.number, q1.[Begin Date])), 0)
                END
            ) AS y_Start
        ,(
            CASE 
                WHEN ((Q1.years - 1) = Q2.number)
                    THEN Q1.[End Date]
                ELSE DATEADD(yy, DATEDIFF(yy, 0, dateadd(yy, q2.number + 1, q1.[Begin Date]) + 1), - 1)
                END
            ) AS y_End
        ,Year(Q1.[Begin Date]) + Q2.number YearInYYYY
    FROM (
        SELECT [Begin Date]
            ,[End Date]
            ,DATEDIFF(year, [Begin Date], [End Date]) + 1 AS years
        FROM my dates
        ) Q1
    INNER JOIN master..spt_values Q2 ON Q2.type = 'P'
        AND Q2.number < Q1.years
    ) Q3
GROUP BY Q3.[Begin Date]
    ,Q3.[End Date]
    ,q3.Diff_in_Year

現在のコードの仕組み: 日付範囲を指定すると、2 つの日付の間の各年の月数。IE 1/1/2014 - 1/18/2015 は、2 つの列 "2014" と 2015" を与え、2014 の値は 12 で、2015 の値は 1 であり、指定された日付の間に 13 か月あることを意味します。

What I am hoping to achieve is something similar to
Start Date    End Date  Month 1   Month 2   Month 3
-----------------------------------------------------
1/1/2014      3/8/2014      4        4         1 
4

1 に答える 1