• I tend to have a generic calendar table build of which this is a cut down version.

    This is the one I tend to use as a prepopulation staging table for a Dim.Calendar, all I need to do is insert the Fulldate and everything is worked out for me.

    CREATE TABLE #Calendar --drop table #dates_to_add

    (

    FullDate DATETIME

    ,YearMonthDay AS Convert(varchar(8),FullDate,112)

    ,YearMonth AS Convert(varchar(6),FullDate,112)

    ,RetentionYear INT

    ,DayWeekNo AS DatePart(dw,FullDate)

    ,DayWeekCode AS CAST(LEFT(DATENAME(weekday,FullDate),3) as Char(3))

    ,DayWeekDesc AS CAST(DATENAME(weekday,FullDate) as Varchar(10))

    ,DayMonthNo AS CAST(DAY(FullDate) as SMALLINT)

    ,DayYearNo AS Cast(DatePart(dy,FullDate) AS SMALLINT)

    ,WeekNo AS CAST(DatePart(wk,FullDate) AS TINYINT)

    ,MonthNo AS CAST(MONTH(FullDate) AS TINYINT)

    ,MonthCode AS CAST(DATENAME(Month,FullDate) AS CHAR(3))

    ,MonthDesc AS CAST(DATENAME(Month,FullDate) AS VARCHAR(10))

    ,RetentionMonthNo INT

    ,QuarterNo AS CAST(DATEPART(qq,FullDate) as TINYINT)

    ,YearNo AS CAST(Year(FullDate) AS INT)

    ,IsMonthEnd AS CAST(CASE

    WHEN ( [FullDate] < '9999-11-30 00:00:00.000' ) -- avoid overflow with poor data in PHX

    THEN

    CASE CONVERT(DATE, [FullDate])

    WHEN CONVERT(DATE, DATEADD(S,-1,DATEADD(mm, DATEDIFF(m,0,[FullDate])+1,0))) THEN 1

    ELSE 0

    END

    ELSE 0

    END AS BIT)

    ,IsQuarterEnd AS CAST(CASE CONVERT(DATE, [FullDate])

    WHEN CONVERT(DATE, DATEADD(qq,DATEDIFF(qq,-1, [FullDate]),-1)) THEN 1

    ELSE 0

    END AS BIT)

    ,IsYearEnd AS CAST(CASE CONVERT(DATE, [FullDate])

    WHEN DATEADD(yy,DATEDIFF(yy,-1,[FullDate]),-1) THEN 1

    ELSE 0

    END AS BIT)

    ,IsWeekend AS CAST(CASE WHEN DateName(DW,FullDate) IN ('Saturday','Sunday') THEN 1 ELSE 0 END AS BIT)

    ,IsHoliday BIT DEFAULT (0)

    ,AggregationType VARCHAR(20) DEFAULT ('Period')

    )

    ;

    The Insert into this is simply

    Insert into #Calendar

    Select FullDate

    From atable

    --Or

    Insert into #Calendar

    Select DateAdd(d,N,@Base)

    From Tally

    Then loading the dim.Calendar from this table as part of the ETL.

    You could create this as a fixed table with all the calculated columns included but there may be a performance hit.

    _________________________________________________________________________
    SSC Guide to Posting and Best Practices