USP_POPULATEDATEDIM

Parameters

Parameter Parameter Type Mode Description
@StartDate datetime IN
@EndDate datetime IN
@QuarterStartMonth int IN

Definition

Copy

CREATE procedure [BBDW].[USP_POPULATEDATEDIM]
                @StartDate         datetime,
                @EndDate           datetime,
                @QuarterStartMonth int = 1
-- @StartDate use in 'MM/DD/YYYY' format
-- @EndDate use in 'MM/DD/YYYY' format
-- @QuarterStartMonth - month when fiscal year starts, e.g. 7 is July 1st, 10 is Oct 1st, etc.  Set 0 to insert default member
as
  begin
    --declare variables
    declare  @DT datetime
    declare  @i int
    declare  @DateKey int
    declare  @CalendarYear smallint
    declare  @CalendarHalf tinyint
    declare  @CalendarHalfName char(2)
    declare  @CalendarQuarter tinyint
    declare  @CalendarQuarterName char(2)
    declare  @CalendarMonth tinyint
    declare  @CalendarMonthName char(10)
    declare  @CalendarWeek tinyint
    declare  @CalendarDayofYear smallint
    declare  @FiscalYear smallint
    declare  @FiscalHalf tinyint
    declare  @FiscalHalfName char(2)
    declare  @FiscalQuarter tinyint
    declare  @FiscalQuarterName char(2)
    declare  @FiscalMonth tinyint
    declare  @FiscalMonthName char(10)
    declare  @FiscalWeek tinyint
    declare  @FiscalDayofYear smallint
    declare  @DayofMonth int
    declare  @DayofWeek int
    declare  @DayName varchar(12)
    declare  @IsWeekend bit
    declare  @IsWeekday bit
    declare  @IsHoliday bit
    declare  @IsClosed bit
    declare  @IsLastClosedDate bit
    declare  @HolidayName varchar(50)
    declare  @MonthName varchar(20)
    declare  @IsLeapYear bit
    declare  @CurrentDateDimID int
    declare  @CurrentDate datetime
    set @CurrentDate = getdate()
    set @CurrentDateDimID = year(@CurrentDate)
                              * 10000
                              + month(@CurrentDate)
                                  * 100
                              + day(@CurrentDate)
    --initialize variables
    select @IsHoliday = 0
    select @IsWeekend = 0
    select @FiscalWeek = 1
    select @CalendarWeek = 1
    select @IsLeapYear = 0
    select @IsClosed = 0
    select @IsLastClosedDate = 0
    --the starting date for the date dimension
    select @DT = @StartDate
    set @i = 1
    --start looping, stop at ending date
    while (@DT <= @EndDate)
      begin
        --get information about the data
        select @IsWeekend = 0
        select @IsWeekDay = 1
        select @CalendarYear = datepart(YYYY,@DT)
        select @CalendarHalf = case datepart(Q,@DT
                                 when 1 then 1
                                 when 2 then 1
                                 when 3 then 2
                                 when 4 then 2
                               end
        select @CalendarHalfName = 'H'
                                     + cast(@CalendarHalf as char)
        select @CalendarQuarter = datepart(Q,@DT)
        select @CalendarQuarterName = 'Q'
                                        + cast(@CalendarQuarter as char)
        select @CalendarMonth = datepart(month,@DT)
        select @CalendarMonthName = datename(MM,@DT)
        select @CalendarWeek = datepart(WW,@DT)
        select @CalendarDayofYear = datepart(DY,@DT)
        select @DayofMonth = datepart(DD,@DT)
        select @DayofWeek = datepart(DW,@DT)
        select @DayName = datename(DW,@DT)
        --note if weekend or not
        if (@DayofWeek = 1
             or @DayofWeek = 7)
          begin
            select @IsWeekend = 1
            select @IsWeekDay = 0
          end
        --add business rule (need to know complete weeks in a year, so a partial week in new year set to 0)
        if (@DayofWeek != 1
            and @FiscalDayofYear = 1)
          begin
            select @FiscalWeek = 0
          end
        if (@DayofWeek = 1)
          begin
            select @FiscalWeek = @FiscalWeek
                                   + 1
          end
        --add business rule (start counting business weeks with first complete week)
        if (@FiscalWeek = 53)
          begin
            select @FiscalWeek = 1
        end
        --check for leap year
        if ((@CalendarYear%4 = 0)
            and (@CalendarYear%100 != 0
                  or @CalendarYear%400 = 0))
          select @IsLeapYear = 1
        else
          select @IsLeapYear = 0
        --insert values into Date Dimension table
        insert DIM_DATE
              (DATEDIMID,
               --DateKey,
               CALENDARYEAR,
               CALENDARHALF,
               CALENDARHALFNAME,
               CALENDARQUARTER,
               CALENDARQUARTERNAME,
               CALENDARMONTH,
               CALENDARMONTHNAME,
               CALENDARWEEK,
               CALENDARDAYOFYEAR,
               FISCALYEAR,
               FISCALHALF,
               FISCALHALFNAME,
               FISCALQUARTER,
               FISCALQUARTERNAME,
               FISCALMONTH,
               FISCALMONTHNAME,
               FISCALWEEK,
               FISCALDAYOFYEAR,
               DAYOFMONTH,
               DAYOFWEEK,
               DAYNAME,
               ISWEEKEND,
               ISWEEKDAY,
               ISHOLIDAY,
               ISLEAPYEAR,
               ISCLOSED,
               ISLASTCLOSEDDATE,
               HOLIDAYNAME,
               ACTUALDATE,
                             ISINCLUDED,
                             ETLCONTROLID,
                             SOURCEDIMID
                             )
        values(--@i,
        (@CalendarYear
                  * 10000)
                 + (@CalendarMonth
                      * 100)
                 + @DayofMonth,
               @CalendarYear,
               @CalendarHalf,
               @CalendarHalfName,
               @CalendarQuarter,
               @CalendarQuarterName,
               @CalendarMonth,
               @CalendarMonthName,
               @CalendarWeek,
               @CalendarDayofYear,
               null,
               null,
               null,
               null,
               null,
               null,
               null,
               null,
               null,
               @DayofMonth,
               @DayofWeek,
               @DayName,
               @IsWeekend,
               @IsWeekDay,
               @IsHoliday,
               @IsLeapYear,
               @IsClosed,
               @IsLastClosedDate,
               '', -- Holiday name (only one per date)
               convert(datetime,cast(@CalendarMonth as varchar)
                                  + '/'
                                  + cast(@DayofMonth as varchar)
                                  + '/'
                                  + cast(@CalendarYear as varchar),
                       101),
                            1,
                            0,
                            1
                            )

        --increment the date one day
        select @DT = dateadd(day,1,@DT)
        set @i = @i
                   + 1
      end
    --***********************  Fiscal Stuff  *****************************************************************
    update DIM_DATE
    set    FISCALQUARTER = convert(int,BBDW.UFN_CALCQUARTERDATE(ACTUALDATE,@QuarterStartMonth,10)),
           FISCALQUARTERNAME = BBDW.UFN_CALCQUARTERDATE(ACTUALDATE,@QuarterStartMonth,1),
           FISCALYEAR = BBDW.UFN_RETURNFISCALYEAR(ACTUALDATE,@QuarterStartMonth)
    where  ACTUALDATE >= @StartDate
           and ACTUALDATE <= @EndDate
    update DIM_DATE
    set    FISCALHALF = case 
                          when FISCALQUARTER in (1,2) then 1
                          else 2
                        end,
           FISCALHALFNAME = case 
                              when FISCALQUARTER in (1,2) then 'H1'
                              else 'H2'
                            end
    where  ACTUALDATE >= @StartDate
           and ACTUALDATE <= @EndDate
    if @QuarterStartMonth > 1
      begin
        -- Fiscal Year Start
        update DIM_DATE
        set    FISCALYEARSTARTDATE = convert(datetime,convert(varchar(4),BBDW.UFN_RETURNFISCALYEAR(ACTUALDATE,@QuarterStartMonth)
                                                                           - 1)
                                                        + '/'
                                                 + convert(varchar(2),@QuarterStartMonth)
                                                        + '/01',101),
               FISCALYEARENDDATE = convert(datetime,convert(varchar(4),BBDW.UFN_RETURNFISCALYEAR(ACTUALDATE,@QuarterStartMonth))
                                                      + '/'
                                                      + convert(varchar(2),@QuarterStartMonth)
                                                      + '/01',101)
                                     - 1
        where  ACTUALDATE >= @StartDate
               and ACTUALDATE <= @EndDate
        update DIM_DATE
        set    FISCALDAYOFYEAR = datediff([DAY],FISCALYEARSTARTDATE,ACTUALDATE)
                                   + 1,
               FISCALWEEK = datediff([WEEK],FISCALYEARSTARTDATE,ACTUALDATE)
                              + 1,
               FISCALMONTH = datediff([MONTH],FISCALYEARSTARTDATE,ACTUALDATE)
                               + 1,
               FISCALMONTHNAME = datename(MM,ACTUALDATE)
        where  ACTUALDATE >= @StartDate
               and ACTUALDATE <= @EndDate
      end -- IF @QuarterStartMonth > 1
    else
      if @QuarterStartMonth = 1
        begin
          update DIM_DATE
          set    FISCALDAYOFYEAR = CALENDARDAYOFYEAR,
                 FISCALWEEK = CALENDARWEEK,
                 FISCALMONTH = CALENDARMONTH,
                 FISCALMONTHNAME = datename(MM,ACTUALDATE)
          where  ACTUALDATE >= @StartDate
                 and ACTUALDATE <= @EndDate
          update DIM_DATE
          set    FISCALYEARSTARTDATE = convert(datetime,convert(varchar(4),BBDW.UFN_RETURNFISCALYEAR(ACTUALDATE,@QuarterStartMonth))
                                                          + '/'
                                                          + convert(varchar(2),@QuarterStartMonth)
                                                          + '/01',101),
                 FISCALYEARENDDATE = convert(datetime,convert(varchar(4),BBDW.UFN_RETURNFISCALYEAR(ACTUALDATE,@QuarterStartMonth)
                                                                           + 1)
                                                        + '/'
                                                        + convert(varchar(2),@QuarterStartMonth)
                                                        + '/01',101)
                                       - 1
          where  ACTUALDATE >= @StartDate
                 and ACTUALDATE <= @EndDate
        end  -- IF @QuarterStartMonth = 1
    -- Period Start & End
    update DIM_DATE
    set    PERIODSTARTDATE = convert(datetime,convert(varchar(4),CALENDARYEAR)
                                                + '-'
                                                + convert(varchar(2),CALENDARMONTH)
                                                + '-1',101),
           PERIODENDDATE = dateadd(MM,1,convert(datetime,convert(varchar(4),CALENDARYEAR)
                                                           + '-'
                                                           + convert(varchar(2),CALENDARMONTH)
                                                           + '-1',101))
                             - 1
    where  ACTUALDATE >= @StartDate
           and ACTUALDATE <= @EndDate
    -- Fiscal Quarter Start & End
    update DIM_DATE
    set    FISCALQUARTERSTARTDATE = T.QUARTERSTARTDATE,
           FISCALQUARTERENDDATE = T.QUARTERENDDATE
    from   (select   FISCALYEAR,
                     FISCALQUARTER,
                     min(ACTUALDATE) as QUARTERSTARTDATE,
                     max(ACTUALDATE) as QUARTERENDDATE
            from     DIM_DATE
            where    ACTUALDATE >= @StartDate
                     and ACTUALDATE <= @EndDate
            group by FISCALYEAR,FISCALQUARTER) T
    where  T.FISCALYEAR = DIM_DATE.FISCALYEAR
           and T.FISCALQUARTER = DIM_DATE.FISCALQUARTER
    -- Calendar Quarter Start & End
    update DIM_DATE
    set    CALENDARQUARTERSTARTDATE = T.QUARTERSTARTDATE,
           CALENDARQUARTERENDDATE = T.QUARTERENDDATE
    from   (select   CALENDARYEAR,
                     CALENDARQUARTER,
                     min(ACTUALDATE) as QUARTERSTARTDATE,
                     max(ACTUALDATE) as QUARTERENDDATE
            from     DIM_DATE
            where    ACTUALDATE >= @StartDate
                     and ACTUALDATE <= @EndDate
            group by CALENDARYEAR,CALENDARQUARTER) T
    where  T.CALENDARYEAR = DIM_DATE.CALENDARYEAR
           and T.CALENDARQUARTER = DIM_DATE.CALENDARQUARTER
    -- Fiscal Period
    update DIM_DATE
    set    FISCALPERIOD = FISCALMONTH
    where  ACTUALDATE >= @StartDate
           and ACTUALDATE <= @EndDate
    -- Fiscal Week Start & End
    update DIM_DATE
    set    FISCALWEEKSTARTDATE = T.STARTDATE,
           FISCALWEEKENDDATE = T.ENDDATE
    from   (select   FISCALYEAR,
                     FISCALWEEK,
                     min(ACTUALDATE) as STARTDATE,
                     max(ACTUALDATE) as ENDDATE
            from     DIM_DATE
            where    ACTUALDATE >= @StartDate
                     and ACTUALDATE <= @EndDate
            group by FISCALYEAR,FISCALWEEK) T
    where  T.FISCALYEAR = DIM_DATE.FISCALYEAR
           and T.FISCALWEEK = DIM_DATE.FISCALWEEK
    -- Calendar Week Start & End
    update DIM_DATE
    set    CALENDARWEEKSTARTDATE = T.STARTDATE,
           CALENDARWEEKENDDATE = T.ENDDATE
    from   (select   CALENDARYEAR,
                     CALENDARWEEK,
                     min(ACTUALDATE) as STARTDATE,
                     max(ACTUALDATE) as ENDDATE
            from     DIM_DATE
            where    ACTUALDATE >= @StartDate
                     and ACTUALDATE <= @EndDate
            group by CALENDARYEAR,CALENDARWEEK) T
    where  T.CALENDARYEAR = DIM_DATE.CALENDARYEAR
           and T.CALENDARWEEK = DIM_DATE.CALENDARWEEK
    -- Date Long Descriptions
    update DIM_DATE
    set    ACTUALDATESTRING = convert(varchar(12),ACTUALDATE,102),
           ACTUALDATESTRINGMDY = left(CALENDARMONTHNAME,3)
                                   + ' '
                                   + convert(varchar(2),DAYOFMONTH)
                                   + ' '
                                   + convert(varchar(4),CALENDARYEAR),
           ACTUALDATESTRINGDMY = convert(varchar(2),DAYOFMONTH)
                                   + ' '
                                   + left(CALENDARMONTHNAME,3)
                                   + ' '
                                   + convert(varchar(4),CALENDARYEAR),
           CALENDARHALFYEARNAME = CALENDARHALFNAME
                                    + ' '
                                    + convert(varchar(4),CALENDARYEAR),
           CALENDARFULLHALFYEARNAME = CALENDARHALFNAME
                                        + ' CY '
                                        + convert(varchar(4),CALENDARYEAR),
           CALENDARQUARTERYEARNAME = CALENDARQUARTERNAME
                                       + ' '
                                       + convert(varchar(4),CALENDARYEAR),
           CALENDARFULLQUARTERYEARNAME = CALENDARQUARTERNAME
                                           + ' CY '
                                           + convert(varchar(4),CALENDARYEAR),
           CALENDARMONTHYEARNAME = left(CALENDARMONTHNAME,3)
                                     + ' '
                                     + convert(varchar(4),CALENDARYEAR),
           CALENDARFULLMONTHYEARNAME = left(CALENDARMONTHNAME,3)
                                         + ' CY '
                                         + convert(varchar(4),CALENDARYEAR),
           CALENDARWEEKYEARNAME = 'W'
                                    + case 
                                        when CALENDARWEEK < 10 then '0'
                                                                      + convert(varchar(2),CALENDARWEEK)
                                        else convert(varchar(2),CALENDARWEEK)
             end
                                    + ' '
                                    + convert(varchar(4),CALENDARYEAR),
           CALENDARFULLWEEKYEARNAME = 'W'
                                        + case 
                                            when CALENDARWEEK < 10 then '0'
                                                                          + convert(varchar(2),CALENDARWEEK)
                                            else convert(varchar(2),CALENDARWEEK)
                                          end
                                        + ' CY  '
                                        + convert(varchar(4),CALENDARYEAR),
           FISCALHALFYEARNAME = FISCALHALFNAME
                                  + ' '
                                  + convert(varchar(4),FISCALYEAR),
           FISCALFULLHALFYEARNAME = FISCALHALFNAME
                                      + ' FY '
                                      + convert(varchar(4),FISCALYEAR),
           FISCALQUARTERYEARNAME = FISCALQUARTERNAME
                                     + ' '
                                     + convert(varchar(4),FISCALYEAR),
           FISCALFULLQUARTERYEARNAME = FISCALQUARTERNAME
                                         + ' FY '
                                         + convert(varchar(4),FISCALYEAR),
           FISCALPERIODYEARNAME = 'Period '
                                    + convert(varchar(2),FISCALPERIOD)
                                    + ' '
                                    + convert(varchar(4),FISCALYEAR),
           FISCALMONTHYEARNAME = left(FISCALMONTHNAME,3)
                                   + ' '
                                   + convert(varchar(4),FISCALYEAR),
           FISCALFULLMONTHYEARNAME = left(FISCALMONTHNAME,3)
                                       + ' FY '
                                       + convert(varchar(4),FISCALYEAR),
           FISCALWEEKYEARNAME = 'W'
                                  + case 
                                      when FISCALWEEK < 10 then '0'
                                                                  + convert(varchar(2),FISCALWEEK)
                                      else convert(varchar(2),FISCALWEEK)
                                    end
                                  + ' '
                                  + convert(varchar(4),FISCALYEAR),
           FISCALFULLWEEKYEARNAME = 'W'
                                      + case 
                                          when FISCALWEEK < 10 then '0'
                                                                      + convert(varchar(2),FISCALWEEK)
                                          else convert(varchar(2),FISCALWEEK)
                                        end
                                      + ' FY '
                                      + convert(varchar(4),FISCALYEAR)
    where  ACTUALDATE >= @StartDate
           and ACTUALDATE <= @EndDate
    -- Set defaults for nth day of week
    update DIM_DATE
    set    MONSEQUENCE = 0,
           TUESEQUENCE = 0,
           WEDSEQUENCE = 0,
           THUSEQUENCE = 0,
           FRISEQUENCE = 0,
           SATSEQUENCE = 0,
           SUNSEQUENCE = 0
    where  ACTUALDATE >= @StartDate
           and ACTUALDATE <= @EndDate
    -- nth Day of Week
    update DIM_DATE
    set    MONSEQUENCE = T.sequence
    from   (select DATEDIMID,
                   rank()
                     over(partition by CALENDARMONTH,CALENDARYEAR order by DATEDIMID) as sequence
            from   DIM_DATE
            where  DAYNAME = 'Monday'
                   and ACTUALDATE >= @StartDate
                   and ACTUALDATE <= @EndDate) T
    where  T.DATEDIMID = DIM_DATE.DATEDIMID
    update DIM_DATE
    set    TUESEQUENCE = T.sequence
    from   (select DATEDIMID,
                   rank()
                     over(partition by CALENDARMONTH,CALENDARYEAR order by DATEDIMID) as sequence
            from   DIM_DATE
            where  DAYNAME = 'Tuesday'
                 and ACTUALDATE >= @StartDate
                   and ACTUALDATE <= @EndDate) T
    where  T.DATEDIMID = DIM_DATE.DATEDIMID
    update DIM_DATE
    set    WEDSEQUENCE = T.sequence
    from   (select DATEDIMID,
                   rank()
                     over(partition by CALENDARMONTH,CALENDARYEAR order by DATEDIMID) as sequence
            from   DIM_DATE
            where  DAYNAME = 'Wednesday'
                   and ACTUALDATE >= @StartDate
                   and ACTUALDATE <= @EndDate) T
    where  T.DATEDIMID = DIM_DATE.DATEDIMID
    update DIM_DATE
    set    THUSEQUENCE = T.sequence
    from   (select DATEDIMID,
                   rank()
                     over(partition by CALENDARMONTH,CALENDARYEAR order by DATEDIMID) as sequence
            from   DIM_DATE
            where  DAYNAME = 'Thursday'
                   and ACTUALDATE >= @StartDate
                   and ACTUALDATE <= @EndDate) T
    where  T.DATEDIMID = DIM_DATE.DATEDIMID
    update DIM_DATE
    set    FRISEQUENCE = T.sequence
    from   (select DATEDIMID,
                   rank()
                     over(partition by CALENDARMONTH,CALENDARYEAR order by DATEDIMID) as sequence
            from   DIM_DATE
            where  DAYNAME = 'Friday'
                   and ACTUALDATE >= @StartDate
                   and ACTUALDATE <= @EndDate) T
    where  T.DATEDIMID = DIM_DATE.DATEDIMID
    update DIM_DATE
    set    SATSEQUENCE = T.sequence
    from   (select DATEDIMID,
                   rank()
                     over(partition by CALENDARMONTH,CALENDARYEAR order by DATEDIMID) as sequence
            from   DIM_DATE
            where  DAYNAME = 'Saturday'
                   and ACTUALDATE >= @StartDate
                   and ACTUALDATE <= @EndDate) T
    where  T.DATEDIMID = DIM_DATE.DATEDIMID
    update DIM_DATE
    set    SUNSEQUENCE = T.sequence
    from   (select DATEDIMID,
                   rank()
                     over(partition by CALENDARMONTH,CALENDARYEAR order by DATEDIMID) as sequence
            from   DIM_DATE
            where  DAYNAME = 'Sunday'
                   and ACTUALDATE >= @StartDate
                   and ACTUALDATE <= @EndDate) T
    where  T.DATEDIMID = DIM_DATE.DATEDIMID

    ------------------------------------------------------------------------------------------
    -- Keys for Fiscal/Calendar Weeks, Months and Quarters
    ------------------------------------------------------------------------------------------
    update DIM_DATE
    set    CALENDARYEARHALF = CALENDARYEAR
                                * 100
                                + CALENDARHALF,
           CALENDARYEARQUARTER = CALENDARYEAR
                                   * 100
                                   + CALENDARQUARTER,
           CALENDARYEARMONTH = CALENDARYEAR
                                 * 100
                                 + CALENDARMONTH,
           CALENDARYEARWEEK = CALENDARYEAR
                                * 100
                                + CALENDARWEEK,
           FISCALYEARHALF = FISCALYEAR
                              * 100
                              + FISCALHALF,
           FISCALYEARQUARTER = FISCALYEAR
                                 * 100
                                 + FISCALQUARTER,
           FISCALYEARPERIOD = FISCALYEAR
                                * 100
                                + FISCALPERIOD,
           FISCALYEARMONTH = FISCALYEAR
                               * 100
                               + FISCALMONTH,
           FISCALYEARWEEK = FISCALYEAR
                              * 100
                              + FISCALWEEK
    where  ACTUALDATE >= @StartDate
           and ACTUALDATE <= @EndDate
    ------------------------------------------------------------------------------------------
    -- Current Date & Filter
    ------------------------------------------------------------------------------------------
    update DIM_DATE
    set    FILTER = 1
    where ACTUALDATE >= @StartDate
           and ACTUALDATE <= @EndDate
    update DIM_DATE
    set    ISCURRENTDATE = 0
    update DIM_DATE
    set    ISCURRENTDATE = 1
    where  DATEDIMID = @CurrentDateDimID

  -- Since & Recency calcs
  update BBDW.DIM_DATE
  set
        DAYSSINCE = DATEDIFF(dd, ACTUALDATE, @CurrentDate),
        WEEKSSINCE = DATEDIFF(ww, ACTUALDATE, @CurrentDate),
        MONTHSSINCE = DATEDIFF(mm, ACTUALDATE, @CurrentDate),
        YEARSSINCE = ROUND(DATEDIFF(mm, ACTUALDATE, @CurrentDate) / 12, 0, 1)
    where DATEDIMID > 0

  end  --- Of Stored Proc