• I don't know that it's faster, but it's certainly simpler.

    ;
    WITH Dates (ID, StartDate, EndDate) AS (
      SELECT 1, '20131201', '20170110' UNION ALL
      SELECT 2, '20131101', '20161110' UNION ALL
      SELECT 3, '20130101', '20140131'
      )
    SELECT
        ID
    ,    MAX(StartDate) AS StartDate
    ,    MAX(EndDate) AS EndDate
    ,    MAX(CASE WHEN n = 5 THEN DaysInPeriod END) AS DaysInYear1
    ,    MAX(CASE WHEN n = 4 THEN DaysInPeriod END) AS DaysInYear2
    ,    MAX(CASE WHEN n = 3 THEN DaysInPeriod END) AS DaysInYear3
    ,    MAX(CASE WHEN n = 2 THEN DaysInPeriod END) AS DaysInYear4
    ,    MAX(CASE WHEN n = 1 THEN DaysInPeriod END) AS DaysInYear5
    FROM Dates
    CROSS APPLY
    (
        SELECT n, PeriodDate, DATEDIFF(DAY, LAG(PeriodDate, 1, StartDate) OVER(PARTITION BY ID ORDER BY PeriodDate), PeriodDate) AS DaysInPeriod

        FROM
        (
            SELECT n, DATEADD(YEAR, DATEDIFF(YEAR, -1, GETDATE()) - n, -1) AS PeriodDate
            FROM ( VALUES(1), (2), (3), (4), (5) ) t(n)
            UNION
            SELECT DATEDIFF(YEAR, EndDate, GETDATE()), EndDate
        ) v
        WHERE PeriodDate > StartDate
            AND PeriodDate <= EndDate
    ) v
    GROUP BY ID
    ;

    J. Drew Allen
    Business Intelligence Analyst
    Philadelphia, PA