Code:
- CREATE TABLE DATE_DIM (
- D_DATE_SK INTEGER NOT NULL
- ,D_DATE DATE DEFAULT NULL
- ,D_MONTH_SEQ FOR COLUMN D_MSEQ INTEGER DEFAULT NULL
- ,D_WEEK_SEQ FOR COLUMN D_WSEQ INTEGER DEFAULT NULL
- ,D_QUARTER_SEQ FOR COLUMN D_QSEQ INTEGER DEFAULT NULL
- ,D_PERIOD_SEQ FOR COLUMN D_PSEQ INTEGER DEFAULT NULL
- ,D_YEAR INTEGER DEFAULT NULL
- ,D_DOW INTEGER DEFAULT NULL
- ,D_DAYOFWEEKINMONTH For Column D_DOWINM Integer Default Null
- ,D_MOY INTEGER DEFAULT NULL
- ,D_DOM INTEGER DEFAULT NULL
- ,D_WOY INTEGER DEFAULT NULL
- ,D_WEEKYEAR INTEGER DEFAULT NULL
-
- ,D_PERIOD INTEGER DEFAULT NULL
- ,D_QOY INTEGER DEFAULT NULL
- ,D_QTRWEEK INTEGER DEFAULT NULL
-
- ,D_FISCAL_YEAR FOR COLUMN D_F_YEAR INTEGER DEFAULT NULL
- ,D_FISCAL_QUARTER FOR COLUMN D_F_QOY INTEGER DEFAULT NULL
- ,D_FISCAL_PERIOD FOR COLUMN D_F_PERIOD INTEGER DEFAULT NULL
-
- ,D_FIRST_DOM FOR COLUMN D_FDOM INTEGER DEFAULT NULL
- ,D_LAST_DOM FOR COLUMN D_LDOM INTEGER DEFAULT NULL
- ,D_FIRST_DOW FOR COLUMN D_FDOW INTEGER DEFAULT NULL
- ,D_LAST_DOW FOR COLUMN D_LDOW INTEGER DEFAULT NULL
- ,D_SAME_DAY_LY FOR COLUMN D_LYDAY INTEGER DEFAULT NULL
- ,D_SAME_DAY_LQ FOR COLUMN D_LQDAY INTEGER DEFAULT NULL
- ,D_SAME_WEEK_LY FOR COLUMN D_LYWEEK INTEGER DEFAULT NULL
-
- ,D_DAY_NAME CHAR(9) CCSID 37 DEFAULT NULL
- ,D_MONTH_NAME FOR COLUMN D_MOYN CHAR(9) CCSID 37 DEFAULT NULL
- ,D_MONTH_ABRV FOR COLUMN D_MOYNA CHAR(3) CCSID 37 DEFAULT NULL
- ,D_MONTH_YEAR FOR COLUMN D_MNYR CHAR(8) CCSID 37 DEFAULT NULL
- ,D_QUARTER_NAME FOR COLUMN D_QOYN CHAR(7) CCSID 37 DEFAULT NULL
- ,D_FISCAL_QUARTER_NAME FOR COLUMN D_F_QOYN CHAR(7) CCSID 37 DEFAULT NULL
-
- ,D_HOLIDAY CHAR(1) CCSID 37 DEFAULT NULL
- ,D_HOLIDAY_NAME FOR COLUMN D_HOLNAME Varchar(50) CCSID 37 DEFAULT NULL
- ,D_FOLLOWING_HOLIDAY FOR COLUMN D_FOLOWHOL CHAR(1) CCSID 37 DEFAULT NULL
- ,D_WEEKEND CHAR(1) CCSID 37 DEFAULT NULL
- ,D_MONTH_FIRST_SAT FOR COLUMN D_FIRSTSAT CHAR(1) CCSID 37 DEFAULT NULL
- ,D_MONTH_FIRST_FULL_WEEK FOR COLUMN D_FIRSTFW CHAR(1) CCSID 37 DEFAULT NULL
- ,D_MONTH_LAST_SAT FOR COLUMN D_LASTSAT CHAR(1) CCSID 37 DEFAULT NULL
- ,D_MONTH_LAST_FULL_WEEK FOR COLUMN D_LASTFW CHAR(1) CCSID 37 DEFAULT NULL
-
- ,D_CURRENT_13_WEEKS FOR COLUMN D_CUR13WK CHAR(1) CCSID 37 DEFAULT NULL
-
- ,D_DATEYYMD DECIMAL(8, 0) DEFAULT NULL
- ,D_DATEMDYY DECIMAL(8, 0) DEFAULT NULL
- ,D_DATECYMD DECIMAL(7, 0) DEFAULT NULL
- ,D_JULIAN DECIMAL(7, 0) DEFAULT NULL
- ,D_CENTURY DECIMAL(2, 0) DEFAULT NULL
- ,D_YEAR2 DECIMAL(2, 0) DEFAULT NULL
- );
-
- LABEL ON TABLE DATE_DIM
- IS 'Date datastructure of all types of date values';
-
- LABEL ON COLUMN DATE_DIM
- (
- D_DATE_SK is 'Date Unique Seq Key'
- ,D_DATE is 'Date'
- ,D_MONTH_SEQ is 'Month Seq Key'
- ,D_WEEK_SEQ is 'Week Seq Key'
- ,D_QUARTER_SEQ is 'Quarter Seq Key'
- ,D_PERIOD_SEQ is 'Period Seq Key'
- ,D_YEAR is 'Year'
- ,D_DOW is 'Day of Week'
- ,D_DAYOFWEEKINMONTH is 'Day of Week In Month'
- ,D_MOY is 'Month of Year'
- ,D_DOM is 'Day of Month'
- ,D_WOY is 'Week of Year'
- ,D_WEEKYEAR is 'Year for Week'
- ,D_PERIOD is 'Period Year'
- ,D_QOY is 'Quarter of Year'
- ,D_QTRWEEK is 'Quarter week of Year'
- ,D_FISCAL_YEAR is 'Fiscal Year'
- ,D_FISCAL_QUARTER is 'Fiscal Quarter'
- ,D_FISCAL_PERIOD is 'Fiscal Period'
- ,D_FIRST_DOM is 'First Day of Month Id'
- ,D_LAST_DOM is 'Last Day of Month Id'
- ,D_FIRST_DOW is 'First Day of Week Id'
- ,D_LAST_DOW is 'Last Day of Week Id'
- ,D_SAME_DAY_LY is 'Same Day Last Year Id'
- ,D_SAME_DAY_LQ is 'Same Day Last Quarter Id'
- ,D_SAME_WEEK_LY is 'Same Week Last Year Id'
- ,D_DAY_NAME is 'Day Name '
- ,D_MONTH_NAME is 'Month Name'
- ,D_MONTH_ABRV is 'Month Abbrv'
- ,D_MONTH_YEAR is 'Month Year Name'
- ,D_QUARTER_NAME is 'Quarter Name'
- ,D_FISCAL_QUARTER_NAME is 'Fiscal Quarter Name'
- ,D_HOLIDAY is 'Is a Holiday'
- ,D_HOLIDAY_NAME is 'Name of Holiday'
- ,D_FOLLOWING_HOLIDAY is 'Follows a Holiday'
- ,D_WEEKEND is 'Is a Weekend'
- ,D_MONTH_FIRST_SAT is 'First Saturday of Month'
- ,D_MONTH_FIRST_FULL_WEEK is 'First Full Week of Month'
- ,D_MONTH_LAST_SAT is 'Last Saturday of Month'
- ,D_MONTH_LAST_FULL_WEEK is 'Last Full Week of Month'
- ,D_CURRENT_13_WEEKS is 'Day In Current 13 Weeks'
- ,D_DATEYYMD is 'Year Month Day Date'
- ,D_DATEMDYY is 'Month Day Year Date'
- ,D_DATECYMD is 'Century Year Month Day Date'
- ,D_JULIAN is 'Julian Date'
- ,D_CENTURY is 'Century'
- ,D_YEAR2 is 'Year'
- ) ;
-
- LABEL ON COLUMN DATE_DIM
- (
- D_DATE_SK text is 'Date Unique Seq Key'
- ,D_DATE text is 'The Date'
- ,D_MONTH_SEQ text is 'Month Seq Key'
- ,D_WEEK_SEQ text is 'Week Seq Key'
- ,D_QUARTER_SEQ text is 'Quarter Seq Key'
- ,D_PERIOD_SEQ text is 'Period Seq Key'
- ,D_YEAR text is 'Year'
- ,D_DOW text is 'Day of Week'
- ,D_DAYOFWEEKINMONTH text is 'Day of Week In Month'
- ,D_MOY text is 'Month of Year'
- ,D_DOM text is 'Day of Month'
- ,D_WOY text is 'Week of Year'
- ,D_WEEKYEAR text is 'Year for week when different than day year'
- ,D_PERIOD text is 'Period Year'
- ,D_QOY text is 'Quarter of Year'
- ,D_QTRWEEK text is 'Quarter week of Year'
- ,D_FISCAL_YEAR text is 'Fiscal Year'
- ,D_FISCAL_QUARTER text is 'Fiscal Quarter'
- ,D_FISCAL_PERIOD text is 'Fiscal Period'
- ,D_FIRST_DOM text is 'First Day of Month Index Entry'
- ,D_LAST_DOM text is 'Last Day of Month Index Entry'
- ,D_FIRST_DOW text is 'First Day of Week Index Entry'
- ,D_LAST_DOW text is 'Last Day of Week Index Entry'
- ,D_SAME_DAY_LY text is 'Same Day Last Year Index Entry'
- ,D_SAME_DAY_LQ text is 'Same Day Last Quarter Index Entry'
- ,D_SAME_WEEK_LY text is 'Same Week Last Year Index Entry'
- ,D_DAY_NAME text is 'Day Name '
- ,D_MONTH_NAME text is 'Month Name'
- ,D_MONTH_ABRV text is 'Month Abbrv'
- ,D_MONTH_YEAR text is 'Month Name Selecting'
- ,D_QUARTER_NAME text is 'Quarter Name'
- ,D_FISCAL_QUARTER_NAME text is 'Fiscal Quarter Name'
- ,D_HOLIDAY text is 'Is a Holiday'
- ,D_HOLIDAY_NAME text is 'Name of Holiday'
- ,D_WEEKEND text is 'Is a Weekend'
- ,D_FOLLOWING_HOLIDAY text is 'Follows a Holiday'
- ,D_MONTH_FIRST_SAT text is 'First Saturday of Month'
- ,D_MONTH_FIRST_FULL_WEEK text is 'First Full Week of Month'
- ,D_MONTH_LAST_SAT text is 'Last Saturday of Month'
- ,D_MONTH_LAST_FULL_WEEK text is 'Last Full Week of Month'
- ,D_CURRENT_13_WEEKS text is 'This is the Current 13 Weeks'
- ,D_DATEYYMD text is 'Numeric Year Month Day Date'
- ,D_DATEMDYY text is 'Numeric Month Day Year Date'
- ,D_DATECYMD text is 'Numeric Century Year Month Day Date'
- ,D_JULIAN text is 'Julian Date'
- ,D_CENTURY text is 'Century'
- ,D_YEAR2 text is 'Year'
- ) ;
-
-
-
-
- Drop Table Qtemp/Date_Dim_dates;
- Drop Table Qtemp/Date_Dim_years;
- Drop Table Qtemp/Date_Dim_calendar;
-
- /* 693596 is the integer you can pass to DATE() in sql to generate '1900-01-01';
- /* Build a list of all dates between 1900-01-01 AND 2099-12-31 */
- Create Table Qtemp/Date_Dim_Dates
- ( D_DATE_SK, D_DATE,D_MONTH_SEQ, D_WEEK_SEQ)
- AS (
- WITH TEMPDATE (LDATE, LDATEID) AS (
- VALUES( DATE(693596 ), 693596 )
- union select DATE(LDATEID) + 1 DAY, LDATEID+1
- FROM TEMPDATE WHERE DATE(LDATEID) < date('2099-12-31')
- )
- select Distinct LDATEID, Ldate
- , DENSE_RANK() OVER( ORDER BY YEAR(LDATE), MONTH(LDATE) )
- , DENSE_RANK() OVER( ORDER BY (LDATEID + (7- dayofweek(LDATE))))
- From TEMPDATE
- ) WITH DATA INCLUDING DEFAULTS;
-
- /* Build table with all years, Number of Weeks,
- Begin Date, and End Date
- Here is the first place were you can decide which years get 53 weeks.
- */
- Create Table Qtemp/Date_Dim_years (D_YEAR, D_YEAR_BEGIN, D_YEAR_END, D_YEAR_WEEKS) As (
- With t1 (D_Year) as (
- Select Year(D_DATE) From Qtemp/Date_Dim_Dates Group By Year(D_Date)
- ), T2 (D_Year, D_BEG, D_END) As (
- Select D_Year
- , ((SELECT T2.D_DATE_SK
- + (CASE Dayofweek(T2.D_DATE)
- WHEN 1 THEN -1 WHEN 2 THEN -2 WHEN 3 THEN -3
- WHEN 4 THEN 3 WHEN 5 THEN 2 WHEN 6 THEN 1 WHEN 7 THEN 0 END)
- FROM Qtemp/Date_Dim_Dates T2
- WHERE T2.D_DATE = DATE('12/31/'|| (T1.D_Year-1))
- )+1 ) /* D_YEAR_BEGIN */
- , ((SELECT T2.D_DATE_SK
- + (CASE Dayofweek(T2.D_DATE)
- WHEN 1 THEN -1 WHEN 2 THEN -2 WHEN 3 THEN -3
- WHEN 4 THEN 3 WHEN 5 THEN 2 WHEN 6 THEN 1 WHEN 7 THEN 0 END)
- FROM Qtemp/Date_Dim_Dates T2
- WHERE T2.D_DATE = DATE('12/31/'|| (T1.D_Year ))
- )) /* D_YEAR_END */
- From T1)
- Select D_Year, D_BEG, D_END, ((D_end-(d_beg-1))/7) From T2
- ) With Data Including Defaults;
-
-
- /* Build table with calendar dates. */
- Create Table Qtemp/Date_Dim_calendar
- (D_CAL_YEAR, D_CAL_WEEKS
- , D_Cal_Week, D_CAL_WEEK_SEQ
- , D_CAL_BEGIN, D_CAL_END
- , D_PERIOD, D_PERIOD_SEQ
- , D_QOY, D_QTRWEEK, D_QUARTER_SEQ) As (
- With TempWeek (Weeknumber) as ( VALUES( 1)
- union select Weeknumber + 1 From TempWeek Where Weeknumber < 53 )
- , WeekNum (Weeknumber) As (Select Distinct Weeknumber From TempWeek)
- , YearWeek (cyear, cweeks) as (
- /* Here is the second place were you can decide which years get 53 weeks. */
- SELECT D_YEAR, D_YEAR_WEEKS
- FROM Qtemp/Date_Dim_years
- Union Values ( 1900, 52))
- , T3 (D_CAL_YEAR, D_CAL_WEEKS, D_Cal_Week, D_CAL_WEEK_SEQ) AS (
- Select Cyear, Cweeks, Weeknumber,
- Row_NUmber() Over(Order By Cyear, Weeknumber) As WkIdx
- From YearWeek
- Cross Join WeekNum
- Where Weeknumber <= cweeks)
- Select D_CAL_YEAR, D_CAL_WEEKS, D_Cal_Week, D_CAL_WEEK_SEQ
- , (Select Min(D_Date_sk)
- From Qtemp/Date_Dim_Dates
- Where D_WEEK_SEQ = T3.D_CAL_WEEK_SEQ)
- , (Select Max(D_Date_sk)
- From Qtemp/Date_Dim_Dates
- Where D_WEEK_SEQ = T3.D_CAL_WEEK_SEQ)
- , INT(0) D_PERIOD_SEQ, INT(0) D_QOY
- , INT(0) AS D_QTRWEEK
- , INT(0) AS D_QUARTER_SEQ
- , INT(0) AS D_PERIOD_SEQ
- From T3
- ) With Data Including Defaults;
-
-
- Update Qtemp/Date_Dim_calendar
- SET D_PERIOD =
- (CASE
- WHEN D_CAL_WEEKS = 53 THEN
- (Case When D_Cal_Week In (1,2,3,4) Then 1
- When D_Cal_Week In (5,6,7,8) Then 2
- When D_Cal_Week In (9,10,11,12,13) Then 3
- When D_Cal_Week In (14,15,16,17) Then 4
- When D_Cal_Week In (18,19,20,21,22) Then 5
- When D_Cal_Week In (23,24,25,26,27) Then 6
- When D_Cal_Week In (28,29,30,31) Then 7
- When D_Cal_Week In (32,33,34,35) Then 8
- When D_Cal_Week In (36,37,38,39,40) Then 9
- When D_Cal_Week In (41,42,43,44) Then 10
- When D_Cal_Week In (45,46,47,48) Then 11
- When D_Cal_Week In (49,50,51,52,53) Then 12
- END)
-
- ELSE /*WHEN D_CAL_WEEKS = 52 THEN*/
- (Case When D_Cal_Week In (1,2,3,4) Then 1
- When D_Cal_Week In (5,6,7,8) Then 2
- When D_Cal_Week In (9,10,11,12,13) Then 3
- When D_Cal_Week In (14,15,16,17) Then 4
- When D_Cal_Week In (18,19,20,21) Then 5
- When D_Cal_Week In (22,23,24,25,26) Then 6
- When D_Cal_Week In (27,28,29,30) Then 7
- When D_Cal_Week In (31,32,33,34) Then 8
- When D_Cal_Week In (35,36,37,38,39) Then 9
- When D_Cal_Week In (40,41,42,43) Then 10
- When D_Cal_Week In (44,45,46,47) Then 11
- When D_Cal_Week In (48,49,50,51,52) Then 12
- END)
- END)
- WHERE D_PERIOD = 0;
-
- UPDATE Qtemp/Date_Dim_calendar
- SET D_QOY = (Case When D_PERIOD >= 10 Then 4
- When D_PERIOD >= 7 Then 3
- When D_PERIOD >= 4 Then 2
- Else 1
- End)
- Where D_QOY = 0;
-
-
- MERGE INTO Qtemp/Date_Dim_calendar T1
- USING (
- Select D_CAL_WEEK_SEQ
- , Row_number()
- Over(Partition By D_CAL_YEAR, D_QOY
- Order By D_CAL_WEEK_SEQ)
- , Dense_rank() Over(Order By D_CAL_YEAR,D_QOY )
- , Dense_rank() Over(Order By D_CAL_YEAR,D_PERIOD )
- from Qtemp/Date_Dim_calendar
- ) T2 (D_CAL_WEEK_SEQ, D_QTRWEEK, D_QUARTER_SEQ, D_PERIOD_SEQ)
- ON T1.D_CAL_WEEK_SEQ=T2.D_CAL_WEEK_SEQ
- WHEN MATCHED THEN
- UPDATE SET T1.D_QTRWEEK = T2.D_QTRWEEK,
- T1.D_QUARTER_SEQ= T2.D_QUARTER_SEQ,
- T1.D_PERIOD_SEQ=T2.D_PERIOD_SEQ;
-
-
- Insert Into DATE_DIM ( D_DATE_SK
- ,D_DATE
- ,D_MONTH_SEQ
- ,D_WEEK_SEQ
- ,D_QUARTER_SEQ
- ,D_PERIOD_SEQ
- ,D_YEAR
- ,D_DOW
- ,D_DAYOFWEEKINMONTH
- ,D_MOY
- ,D_DOM
- ,D_WOY
- ,D_WEEKYEAR
-
- ,D_PERIOD
- ,D_QOY
- ,D_QTRWEEK
-
- ,D_FIRST_DOM
- ,D_LAST_DOM
- ,D_FIRST_DOW
- ,D_LAST_DOW
-
- ,D_DAY_NAME
- ,D_MONTH_NAME
- ,D_MONTH_ABRV
- ,D_MONTH_YEAR
- ,D_QUARTER_NAME
- ,D_FISCAL_QUARTER_NAME
-
- ,D_WEEKEND
- ,D_MONTH_FIRST_SAT
- ,D_MONTH_FIRST_FULL_WEEK
- ,D_MONTH_LAST_SAT
- ,D_MONTH_LAST_FULL_WEEK
-
- ,D_DATEYYMD
- ,D_DATEMDYY
- ,D_DATECYMD
- ,D_JULIAN
- ,D_CENTURY
- ,D_Year2
- )
- SELECT T1.D_DATE_SK
- , T1.D_DATE
- , T1.D_MONTH_SEQ
- , T1.D_WEEK_SEQ
- , T3.D_QUARTER_SEQ
- , T3.D_PERIOD_SEQ
- , YEAR(T1.D_DATE) D_YEAR
- , DAYOFWEEK(T1.D_DATE) D_DOW
- , (FLOOR(DAY(T1.D_DATE)/7) + CASE WHEN MOD(DAY(T1.D_DATE),7) > 0 THEN 1 ELSE 0 END) D_DAYOFWEEKINMONTH
- , MONTH(T1.D_DATE) D_MOY
- , DAY(T1.D_DATE) D_DOM
- , T3.D_Cal_Week D_WOY
- , T3.D_cal_year D_WEEKYEAR
- , T3.D_PERIOD
- , T3.D_QOY
- , T3.D_QTRWEEK
-
- , (T1.D_DATE_SK- DAYOFMONTH(T1.D_DATE) +1) D_FIRST_DOM
- , (T1.D_DATE_SK- DAYOFMONTH(T1.D_DATE) + DAYOFMONTH(LAST_DAY(T1.D_DATE))) D_LAST_DOM
- , (T1.D_DATE_SK- DAYOFWEEK(T1.D_DATE) +1) D_FIRST_DOW
- , (T1.D_DATE_SK- DAYOFWEEK(T1.D_DATE) +7) D_LAST_DOW
-
- , CAST(DAYNAME(T1.D_DATE) AS CHAR(9)) D_DAY_NAME
- , MONTHNAME(T1.D_DATE) D_MONTH_NAME
- , UCASE(Substr(Monthname(T1.D_DATE), 1,3)) D_MONTH_ABRV
- , UCASE(Substr(Monthname(T1.D_DATE), 1,3)) ||' '|| YEAR(T1.D_DATE) D_MONTH_YEAR
- , ('Q' || DIGITS(DEC(T3.D_QOY,1,0)) || ' '|| T3.D_CAL_YEAR ) D_QUARTER_NAME
-
- , CASE WHEN DAYOFWEEK(T1.D_DATE) IN (1,7) THEN 'Y' END D_WEEKEND
- , CASE WHEN DAY(T1.D_DATE) < 8
- AND DAYOFWEEK(T1.D_DATE) = 7
- THEN 'Y' END D_MONTH_FIRST_SAT
- , (
- /* IF the first day of the month is dow 1 then week 1, else week 2 */
- CASE WHEN DAYOFWEEK(DATE(T1.D_DATE_SK-DAYOFMONTH(T1.D_DATE)+1))= 1
- AND WEEK(DATE(T1.D_DATE_SK- DAYOFMONTH(T1.D_DATE)+1))
- =WEEK(T1.D_DATE)
- THEN 'Y'
- WHEN DAYOFWEEK(DATE(T1.D_DATE_SK- DAYOFMONTH(T1.D_DATE) +1)) > 1
- AND (WEEK(DATE(T1.D_DATE_SK- DAYOFMONTH(T1.D_DATE) +1))+1)
- =WEEK(T1.D_DATE) THEN 'Y'
- END) D_MONTH_FIRST_FULL_WEEK
- , (CASE WHEN DAY(T1.D_DATE) > DAYOFMONTH(LAST_DAY(T1.D_DATE))-7
- AND DAYOFWEEK(T1.D_DATE) = 7
- THEN 'Y'
- END) D_MONTH_LAST_SAT
- , (
- /* IF the LAST day of the month is dow 7 then LAST week, else LAST WEEK-1 */
- CASE WHEN DAYOFWEEK( DATE(T1.D_DATE_SK- DAYOFMONTH(T1.D_DATE)
- + DAYOFMONTH(LAST_DAY(T1.D_DATE))))=7
- AND WEEK(DATE(T1.D_DATE_SK -DAYOFMONTH(T1.D_DATE)
- + DAYOFMONTH(LAST_DAY(T1.D_DATE))))=WEEK(T1.D_DATE)
- THEN 'Y'
- WHEN DAYOFWEEK(DATE(T1.D_DATE_SK- DAYOFMONTH(T1.D_DATE)
- + DAYOFMONTH(LAST_DAY(T1.D_DATE)))) < 7
- AND (WEEK(DATE(T1.D_DATE_SK - DAYOFMONTH(T1.D_DATE)
- + DAYOFMONTH(LAST_DAY(T1.D_DATE))))-1)=WEEK(T1.D_DATE)
- THEN 'Y'
- END) D_MONTH_LAST_FULL_WEEK
-
- ,(YEAR(T1.D_DATE)*10000
- +DEC(MONTH(T1.D_DATE),2,0)*100
- +DEC(DAY(T1.D_DATE),2,0)) D_DATEYYMD
-
- , (DEC(MONTH(T1.D_DATE),2,0)*1000000
- +DEC(DAY(T1.D_DATE),2,0)*10000
- +YEAR(T1.D_DATE)) D_DATEMDYY
-
- ,((YEAR(T1.D_DATE)-1900)*10000
- +DEC(MONTH(T1.D_DATE),2,0)*100
- +DEC(DAY(T1.D_DATE),2,0)) D_DATECYMD
-
- , (DEC( YEAR(T1.D_DATE) *1000 + DAYOFYEAR(T1.D_DATE) ,7,0)) D_JULIAN
- , DEC(SUBSTR(DIGITS(DEC(YEAR(T1.D_DATE),4,0)),1,2),2,0) D_CENTURY
- , DEC(SUBSTR(DIGITS(DEC(YEAR(T1.D_DATE),4,0)),3,2),2,0) D_Year2
-
- From Qtemp/Date_Dim_dates T1
- Join Qtemp/Date_Dim_calendar T3
- On T1.D_date_sk Between T3.D_CAL_BEGIN And T3.D_CAL_END;
-
-
-
- /* Holidays are rather *fun* to load */
- Update Date_Dim
- Set D_HOLIDAY_NAME ='Thanksgiving Day'
- Where D_MOY = 11
- And D_DAYOFWEEKINMONTH = 4
- And D_DOW = 5;
-
- Update Date_Dim
- Set D_HOLIDAY_NAME ='Christmas Day'
- Where D_MOY = 12
- And D_DOM = 25;
-
- Update Date_Dim
- Set D_HOLIDAY_NAME ='Independance Day'
- Where D_MOY = 7
- And D_DOM = 4;
-
- Update Date_Dim
- Set D_HOLIDAY_NAME = 'New Year''s Day'
- Where D_MOY = 1
- And D_DOM = 1;
-
- Update Date_Dim
- Set D_HOLIDAY_NAME = 'Memorial Day'
- Where D_Date_Sk In (
- Select Max(D_Date_Sk)
- From Date_Dim
- Where D_MOY = 5 And D_DOW = 2
- Group By D_Year, D_Moy);
-
- /* Labor Day - First Monday in September */
- Update Date_Dim
- Set D_HOLIDAY_NAME = 'Labor Day'
- Where D_Date_Sk In (
- Select Max(D_Date_Sk)
- From Date_Dim
- Where D_MOY = 9 And D_DOW = 2
- Group By D_Year, D_Moy);
-
- Update Date_Dim
- Set D_HOLIDAY_NAME = 'Valentine''s Day'
- Where D_MOY = 2 And D_DOM = 14;
-
- Update Date_Dim
- Set D_HOLIDAY_NAME = 'Saint Patrick''s Day'
- Where D_MOY = 3 And D_DOM = 17;
-
- Update Date_Dim
- Set D_HOLIDAY_NAME = 'Martin Luthor King Jr Day'
- Where D_MOY = 1 And D_DOW = 2 And D_Year >= 1983
- And D_DAYOFWEEKINMONTH = 3;
-
- Update Date_Dim
- Set D_HOLIDAY_NAME = 'President''s Day'
- Where D_MOY = 2 And D_DOW = 2
- And D_DAYOFWEEKINMONTH = 3;
-
- Update Date_Dim
- Set D_HOLIDAY_NAME = 'Mother''s Day'
- Where D_MOY = 5 And D_DOW = 1
- And D_DAYOFWEEKINMONTH = 2;
-
- Update Date_Dim
- Set D_HOLIDAY_NAME = 'Father''s Day'
- Where D_MOY = 6 And D_DOW = 1
- And D_DAYOFWEEKINMONTH = 3;
-
- Update Date_Dim
- Set D_HOLIDAY_NAME = 'Halloween'
- Where D_MOY = 10 And D_DOM = 31;
-
- /* Election Day - The first Tuesday after the first Monday in November*/
- Update Date_Dim
- Set D_HOLIDAY_NAME = 'Election Day'
- Where D_Date_Sk In (
- Select Max(D_Date_Sk)+1
- From Date_Dim
- Where D_MOY = 11 And D_DOW = 2
- And D_DAYOFWEEKINMONTH = 1
- Group By D_Year, D_Moy);
-
- Update Date_Dim
- Set D_HOLIDAY_NAME = 'April Fools'' Day'
- Where D_MOY = 4 And D_DOM = 1;
-
- /* Easter is fun
- These are the dates copied from this webpage.
- http://www.timeanddate.com/holidays/us/easter-sunday
- */
-
- Exec Sql Update Date_Dim
- Set D_HOLIDAY_NAME = 'Easter'
- Where D_Date In
- ('1900-04-15' ,'1901-04-07' ,'1902-03-30' ,'1903-04-12'
- ,'1904-04-03' ,'1905-04-23' ,'1906-04-15' ,'1907-03-31'
- ,'1908-04-19' ,'1909-04-11' ,'1910-03-27' ,'1911-04-16'
- ,'1912-04-07' ,'1913-03-23' ,'1914-04-12' ,'1915-04-04'
- ,'1916-04-23' ,'1917-04-08' ,'1918-03-31' ,'1919-04-20'
- ,'1920-04-04' ,'1921-03-27' ,'1922-04-16' ,'1923-04-01'
- ,'1924-04-20' ,'1925-04-12' ,'1926-04-04' ,'1927-04-17'
- ,'1928-04-08' ,'1929-03-31' ,'1930-04-20' ,'1931-04-05'
- ,'1932-03-27' ,'1933-04-16' ,'1934-04-01' ,'1935-04-21'
- ,'1936-04-12' ,'1937-03-28' ,'1938-04-17' ,'1939-04-09'
- ,'1940-03-24' ,'1941-04-13' ,'1942-04-05' ,'1943-04-25'
- ,'1944-04-09' ,'1945-04-01' ,'1946-04-21' ,'1947-04-06'
- ,'1948-03-28' ,'1949-04-17' ,'1950-04-09' ,'1951-03-25'
- ,'1952-04-13' ,'1953-04-05' ,'1954-04-18' ,'1955-04-10'
- ,'1956-04-01' ,'1957-04-21' ,'1958-04-06' ,'1959-03-29'
- ,'1960-04-17' ,'1961-04-02' ,'1962-04-22' ,'1963-04-14'
- ,'1964-03-29' ,'1965-04-18' ,'1966-04-10' ,'1967-03-26'
- ,'1968-04-14' ,'1969-04-06' ,'1970-03-29' ,'1971-04-11'
- ,'1972-04-02' ,'1973-04-22' ,'1974-04-14' ,'1975-03-30'
- ,'1976-04-18' ,'1977-04-10' ,'1978-03-26' ,'1979-04-15'
- ,'1980-04-06' ,'1981-04-19' ,'1982-04-11' ,'1983-04-03'
- ,'1984-04-22' ,'1985-04-07' ,'1986-03-30' ,'1987-04-19'
- ,'1988-04-03' ,'1989-03-26' ,'1990-04-15' ,'1991-03-31'
- ,'1992-04-19' ,'1993-04-11' ,'1994-04-03' ,'1995-04-16'
- ,'1996-04-07' ,'1997-03-30' ,'1998-04-12' ,'1999-04-04'
- ,'2000-04-23' ,'2001-04-15' ,'2002-03-31' ,'2003-04-20'
- ,'2004-04-11' ,'2005-03-27' ,'2006-04-16' ,'2007-04-08'
- ,'2008-03-23' ,'2009-04-12' ,'2010-04-04' ,'2011-04-24'
- ,'2012-04-08' ,'2013-03-31' ,'2014-04-20' ,'2015-04-05'
- ,'2016-03-27' ,'2017-04-16' ,'2018-04-01' ,'2019-04-21'
- ,'2020-04-12' ,'2021-04-04' ,'2022-04-17' ,'2023-04-09'
- ,'2024-03-31' ,'2025-04-20' ,'2026-04-05' ,'2027-03-28'
- ,'2028-04-16' ,'2029-04-01' ,'2030-04-21' ,'2031-04-13'
- ,'2032-03-28' ,'2033-04-17' ,'2034-04-09' ,'2035-03-25'
- ,'2036-04-13' ,'2037-04-05' ,'2038-04-25' ,'2039-04-10'
- ,'2040-04-01' ,'2041-04-21' ,'2042-04-06' ,'2043-03-29'
- ,'2044-04-17' ,'2045-04-09' ,'2046-03-25' ,'2047-04-14'
- ,'2048-04-05' ,'2049-04-18' ,'2050-04-10' ,'2051-04-02'
- ,'2052-04-21' ,'2053-04-06' ,'2054-03-29' ,'2055-04-18'
- ,'2056-04-02' ,'2057-04-22' ,'2058-04-14' ,'2059-03-30'
- ,'2060-04-18' ,'2061-04-10' ,'2062-03-26' ,'2063-04-15'
- ,'2064-04-06' ,'2065-03-29' ,'2066-04-11' ,'2067-04-03'
- ,'2068-04-22' ,'2069-04-14' ,'2070-03-30' ,'2071-04-19'
- ,'2072-04-10' ,'2073-03-26' ,'2074-04-15' ,'2075-04-07'
- ,'2076-04-19' ,'2077-04-11' ,'2078-04-03' ,'2079-04-23'
- ,'2080-04-07' ,'2081-03-30' ,'2082-04-19' ,'2083-04-04'
- ,'2084-03-26' ,'2085-04-15' ,'2086-03-31' ,'2087-04-20'
- ,'2088-04-11' ,'2089-04-03' ,'2090-04-16' ,'2091-04-08'
- ,'2092-03-30' ,'2093-04-12' ,'2094-04-04' ,'2095-04-24'
- ,'2096-04-15' ,'2097-03-31' ,'2098-04-20' ,'2099-04-12')
- ;
-
-
- Update Date_DIm
- Set D_HOLIDAY = CASE
- WHEN D_Holiday_Name is null then null
- Else 'Y' End;
-
|
|