Date dimension table - part II

15
The importance of date dimension in a data warehouse and BI project: SQL code Date: December 30 th 2015 Author: Dirk Cludts

Transcript of Date dimension table - part II

The importance of date dimension

in a data warehouse and BI project: SQL code

Date: December 30th 2015

Author: Dirk Cludts

Page 2 The importance of a date dimension in a data warehouse and BI project: SQL code

Web-IT Support and Consulting ~ [email protected]

1. Introduction

As introduction I refer to my previous post on date dimension:

https://www.linkedin.com/pulse/importance-date-dimension-data-warehouse-bi-project-dirk-

cludts?trk=prof-post. Some people send me InMails to have more explanation on this topic and it

was well appreciated during my training sessions. That’s why I now write a technical article with

code to fill a date dimension table.

All comments are welcome and I know that some functions can be written otherwise. But this is the

way I do it at my customers. It’s very fast and gives a lot of options to modify and make some tailor

made code out of it. So consider it as a very good basis where you can build on.

In this article I explain the most commonly used date dimension fields. It’s certainly possible that for

specific needs other fields are needed.

Don’t forget, this is just the part for a calendar year (01/01/YYYY until 31/12/YYYY). If you have a

different fiscal year you need to double most fields and modify the code to fill these fields. If you

need help doing this, just drop me a message.

Feel free to use and share this code and give me your feedback.

Dirk

Page 3 The importance of a date dimension in a data warehouse and BI project: SQL code

Web-IT Support and Consulting ~ [email protected]

2. Code and functions

2.1. Step1: Create tables to store translations of days and months

CREATE TABLE [dbo].[TblDay](

[DayID] [int] NOT NULL,

[DayNameLongNL] [varchar](25) NULL,

[DayNameLongFR] [varchar](25) NULL,

[DayNameLongUK] [varchar](25) NULL,

[DayNameLongGE] [varchar](25) NULL,

[DayNameAbbrevNL] [varchar](4) NULL,

[DayNameAbbrevFR] [varchar](4) NULL,

[DayNameAbbrevUK] [varchar](4) NULL,

[DayNameAbbrevGE] [varchar](4) NULL,

CONSTRAINT [PK_TblDay] PRIMARY KEY CLUSTERED

(

[DayID] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

Page 4 The importance of a date dimension in a data warehouse and BI project: SQL code

Web-IT Support and Consulting ~ [email protected]

CREATE TABLE [dbo].[TblMonth](

[MonthID] [int] NOT NULL,

[MonthNameLongNL] [varchar](25) NULL,

[MonthNameLongFR] [varchar](25) NULL,

[MonthNameLongUK] [varchar](25) NULL,

[MonthNameLongGE] [varchar](25) NULL,

[MonthNameAbbrevNL] [varchar](4) NULL,

[MonthNameAbbrevFR] [varchar](4) NULL,

[MonthNameAbbrevUK] [varchar](4) NULL,

[MonthNameAbbrevGE] [varchar](4) NULL,

CONSTRAINT [PK_TblMonth] PRIMARY KEY CLUSTERED

(

[MonthID] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

Page 5 The importance of a date dimension in a data warehouse and BI project: SQL code

Web-IT Support and Consulting ~ [email protected]

2.2. Step 2: Create dimension table

For selection and sorting purposes, it’s possible that you need to add additional indexes. This depends from what you want to do with the different fields.

CREATE TABLE [dbo].[DimDate](

[DateID] [int] NOT NULL,

[DateStandardName] [date] NULL,

[DateStandardEUR] [char](10) NULL,

[DateStandardUS] [char](10) NULL,

[DateStandardDay] [int] NULL,

[DateStandardDayWeek] [int] NULL,

[DateStandardDayQuarter] [int] NULL,

[DateStandardDayYear] [int] NULL,

[DateStandardDayNameLongNL] [varchar](25) NULL,

[DateStandardDayNameLongFR] [varchar](25) NULL,

[DateStandardDayNameLongUK] [varchar](25) NULL,

[DateStandardDayNameLongGE] [varchar](25) NULL,

[DateStandardDayNameAbbrevNL] [varchar](4) NULL,

[DateStandardDayNameAbbrevFR] [varchar](4) NULL,

[DateStandardDayNameAbbrevUK] [varchar](4) NULL,

[DateStandardDayNameAbbrevGE] [varchar](4) NULL,

[DateStandardWeek] [int] NULL,

[DateStandardWeekNameNL] [varchar](25) NULL,

[DateStandardWeekNameFR] [varchar](25) NULL,

[DateStandardWeekNameUK] [varchar](25) NULL,

[DateStandardWeekNameGE] [varchar](25) NULL,

[DateStandardWeekYearNameNL] [varchar](25) NULL,

[DateStandardWeekYearNameFR] [varchar](25) NULL,

[DateStandardWeekYearNameUK] [varchar](25) NULL,

[DateStandardWeekYearNameGE] [varchar](25) NULL,

[DateStandardMonth] [int] NULL,

[DateStandardMonthNameLongNL] [varchar](25) NULL,

[DateStandardMonthNameLongFR] [varchar](25) NULL,

[DateStandardMonthNameLongUK] [varchar](25) NULL,

[DateStandardMonthNameLongGE] [varchar](25) NULL,

[DateStandardMonthYearNameLongNL] [varchar](50) NULL,

[DateStandardMonthYearNameLongFR] [varchar](50) NULL,

[DateStandardMonthYearNameLongUK] [varchar](50) NULL,

[DateStandardMonthYearNameLongGE] [varchar](50) NULL,

[DateStandardMonthNameAbbrevNL] [varchar](4) NULL,

[DateStandardMonthNameAbbrevFR] [varchar](4) NULL,

[DateStandardMonthNameAbbrevUK] [varchar](4) NULL,

[DateStandardMonthNameAbbrevGE] [varchar](4) NULL,

[DateStandardMonthYearNameAbbrevNL] [varchar](25) NULL,

[DateStandardMonthYearNameAbbrevFR] [varchar](25) NULL,

[DateStandardMonthYearNameAbbrevUK] [varchar](25) NULL,

Page 6 The importance of a date dimension in a data warehouse and BI project: SQL code

Web-IT Support and Consulting ~ [email protected]

[DateStandardMonthYearNameAbbrevGE] [varchar](25) NULL,

[DateStandardQuarter] [int] NULL,

[DateStandardQuarterNameNL] [varchar](25) NULL,

[DateStandardQuarterNameFR] [varchar](25) NULL,

[DateStandardQuarterNameUK] [varchar](25) NULL,

[DateStandardQuarterNameGE] [varchar](25) NULL,

[DateStandardQuarterYearNameNL] [varchar](25) NULL,

[DateStandardQuarterYearNameFR] [varchar](25) NULL,

[DateStandardQuarterYearNameUK] [varchar](25) NULL,

[DateStandardQuarterYearNameGE] [varchar](25) NULL,

[DateStandardYear] [int] NULL,

[DateStandardStartWeek] [datetime] NULL,

[DateStandardEndWeek] [datetime] NULL,

[DateStandardStartWeekID] [int] NULL,

[DateStandardEndWeekID] [int] NULL,

[DateStandardStartMonth] [datetime] NULL,

[DateStandardEndMonth] [datetime] NULL,

[DateStandardStartMonthID] [int] NULL,

[DateStandardEndMonthID] [int] NULL,

[DateStandardStartQuarter] [datetime] NULL,

[DateStandardEndQuarter] [datetime] NULL,

[DateStandardStartQuarterID] [int] NULL,

[DateStandardEndQuarterID] [int] NULL,

[DateStandardColorFont] [varchar](25) NULL,

[DateStandardColorObject] [varchar](25) NULL,

CONSTRAINT [PK_TblDate] PRIMARY KEY CLUSTERED

(

[DateID] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

Page 7 The importance of a date dimension in a data warehouse and BI project: SQL code

Web-IT Support and Consulting ~ [email protected]

Page 8 The importance of a date dimension in a data warehouse and BI project: SQL code

Web-IT Support and Consulting ~ [email protected]

Page 9 The importance of a date dimension in a data warehouse and BI project: SQL code

Web-IT Support and Consulting ~ [email protected]

Page 10 The importance of a date dimension in a data warehouse and BI project: SQL code

Web-IT Support and Consulting ~ [email protected]

2.3. Step 3: Create stored procedure to fill up the table

CREATE PROCEDURE [dbo].[SpInsertDimDate]

AS

BEGIN

SET NOCOUNT ON;

-- Declare all variables (can also be parameters that can be entered by the users when running the stored procedure)

DECLARE @StartDate AS DATE

DECLARE @EndDate AS DATE

DECLARE @CurrentDate AS DATE

DECLARE @WeekendColorFont AS VARCHAR(10)

DECLARE @WeekendColorObject AS VARCHAR(10)

DECLARE @WeekColorFont AS VARCHAR(10)

DECLARE @WeekColorObject AS VARCHAR(10)

-- Set values of variables

SET @StartDate = '2015-01-01'

SET @EndDate = '2017-12-31'

-- Define your own reporting colors for weekdays and weekend days

SET @WeekColorFont = '#000000'

SET @WeekendColorFont = '#FF0000'

SET @WeekColorObject = '#FFFFFF'

SET @WeekendColorObject = '#CCCCCC'

SET @CurrentDate = @StartDate

-- Loop through date range based on variables (@StartDate <> @EndDate)

WHILE @CurrentDate <= @EndDate

BEGIN

-- Start insert statement

INSERT INTO dbo.DimDate

(

DateID

, DateStandardName

, DateStandardEUR

, DateStandardUS

, DateStandardDay

, DateStandardDayWeek

, DateStandardDayQuarter

, DateStandardDayYear

, DateStandardDayNameLongNL

, DateStandardDayNameLongFR

, DateStandardDayNameLongUK

, DateStandardDayNameLongGE

, DateStandardDayNameAbbrevNL

, DateStandardDayNameAbbrevFR

, DateStandardDayNameAbbrevUK

, DateStandardDayNameAbbrevGE

, DateStandardWeek

Page 11 The importance of a date dimension in a data warehouse and BI project: SQL code

Web-IT Support and Consulting ~ [email protected]

, DateStandardWeekNameNL

, DateStandardWeekNameFR

, DateStandardWeekNameUK

, DateStandardWeekNameGE

, DateStandardWeekYearNameNL

, DateStandardWeekYearNameFR

, DateStandardWeekYearNameUK

, DateStandardWeekYearNameGE

, DateStandardMonth

, DateStandardMonthNameLongNL

, DateStandardMonthNameLongFR

, DateStandardMonthNameLongUK

, DateStandardMonthNameLongGE

, DateStandardMonthYearNameLongNL

, DateStandardMonthYearNameLongFR

, DateStandardMonthYearNameLongUK

, DateStandardMonthYearNameLongGE

, DateStandardMonthNameAbbrevNL

, DateStandardMonthNameAbbrevFR

, DateStandardMonthNameAbbrevUK

, DateStandardMonthNameAbbrevGE

, DateStandardMonthYearNameAbbrevNL

, DateStandardMonthYearNameAbbrevFR

, DateStandardMonthYearNameAbbrevUK

, DateStandardMonthYearNameAbbrevGE

, DateStandardQuarter

, DateStandardQuarterNameNL

, DateStandardQuarterNameFR

, DateStandardQuarterNameUK

, DateStandardQuarterNameGE

, DateStandardQuarterYearNameNL

, DateStandardQuarterYearNameFR

, DateStandardQuarterYearNameUK

, DateStandardQuarterYearNameGE

, DateStandardYear

, DateStandardStartWeek

, DateStandardEndWeek

, DateStandardStartWeekID

, DateStandardEndWeekID

, DateStandardStartMonth

, DateStandardEndMonth

, DateStandardStartMonthID

, DateStandardEndMonthID

, DateStandardStartQuarter

, DateStandardEndQuarter

, DateStandardStartQuarterID

, DateStandardEndQuarterID

, DateStandardColorFont

, DateStandardColorObject

)

-- End insert statement

Page 12 The importance of a date dimension in a data warehouse and BI project: SQL code

Web-IT Support and Consulting ~ [email protected]

-- Start of values to insert

SELECT

DateID

, DateStandardName

, DateStandardEUR

, DateStandardUS

, DateStandardDay

, DateStandardDayWeek

, DateStandardDayQuarter

, DateStandardDayYear

, TblDay.DayNameLongNL AS DateStandardDayNameLongNL

, TblDay.DayNameLongFR AS DateStandardDayNameLongFR

, TblDay.DayNameLongUK AS DateStandardDayNameLongUK

, TblDay.DayNameLongGE AS DateStandardDayNameLongGE

, TblDay.DayNameAbbrevNL AS DateStandardDayNameAbbrevNL

, TblDay.DayNameAbbrevFR AS DateStandardDayNameAbbrevFR

, TblDay.DayNameAbbrevUK AS DateStandardDayNameAbbrevUK

, TblDay.DayNameAbbrevGE AS DateStandardDayNameAbbrevGE

, DateStandardWeek

, DateStandardWeekNameNL

, DateStandardWeekNameFR

, DateStandardWeekNameUK

, DateStandardWeekNameGE

, DateStandardWeekYearNameNL

, DateStandardWeekYearNameFR

, DateStandardWeekYearNameUK

, DateStandardWeekYearNameGE

, DateStandardMonth

, TblMonth.MonthNameLongNL AS DateStandardMonthNameLongNL

, TblMonth.MonthNameLongFR AS DateStandardMonthNameLongFR

, TblMonth.MonthNameLongUK AS DateStandardMonthNameLongUK

, TblMonth.MonthNameLongGE AS DateStandardMonthNameLongGE

, TblMonth.MonthNameLongNL + ' - ' + CONVERT(VARCHAR(4), DateStandardYear) AS DateStandardMonthYearNameLongNL

, TblMonth.MonthNameLongFR + ' - ' + CONVERT(VARCHAR(4), DateStandardYear) AS DateStandardMonthYearNameLongFR

, TblMonth.MonthNameLongUK + ' - ' + CONVERT(VARCHAR(4), DateStandardYear) AS DateStandardMonthYearNameLongUK

, TblMonth.MonthNameLongGE + ' - ' + CONVERT(VARCHAR(4), DateStandardYear) AS DateStandardMonthYearNameLongGE

, TblMonth.MonthNameAbbrevNL AS DateStandardMonthNameAbbrevNL

, TblMonth.MonthNameAbbrevFR AS DateStandardMonthNameAbbrevFR

, TblMonth.MonthNameAbbrevUK AS DateStandardMonthNameAbbrevUK

, TblMonth.MonthNameAbbrevGE AS DateStandardMonthNameAbbrevGE

, TblMonth.MonthNameAbbrevNL + ' - ' + CONVERT(VARCHAR(4), DateStandardYear) AS DateStandardMonthYearNameAbbrevNL

, TblMonth.MonthNameAbbrevFR + ' - ' + CONVERT(VARCHAR(4), DateStandardYear) AS DateStandardMonthYearNameAbbrevFR

, TblMonth.MonthNameAbbrevUK + ' - ' + CONVERT(VARCHAR(4), DateStandardYear) AS DateStandardMonthYearNameAbbrevUK

, TblMonth.MonthNameAbbrevGE + ' - ' + CONVERT(VARCHAR(4), DateStandardYear) AS DateStandardMonthYearNameAbbrevGE

, DateStandardQuarter

, DateStandardQuarterNameNL

, DateStandardQuarterNameFR

, DateStandardQuarterNameUK

, DateStandardQuarterNameGE

, DateStandardQuarterYearNameNL

, DateStandardQuarterYearNameFR

Page 13 The importance of a date dimension in a data warehouse and BI project: SQL code

Web-IT Support and Consulting ~ [email protected]

, DateStandardQuarterYearNameUK

, DateStandardQuarterYearNameGE

, DateStandardYear

, DateStandardStartWeek

, DateStandardEndWeek

, DateStandardStartWeekID

, DateStandardEndWeekID

, DateStandardStartMonth

, DateStandardEndMonth

, DateStandardStartMonthID

, DateStandardEndMonthID

, DateStandardStartQuarter

, DateStandardEndQuarter

, DateStandardStartQuarterID

, DateStandardEndQuarterID

, DateStandardColorFont

, DateStandardColorObject

FROM

(

SELECT

FORMAT(@CurrentDate, 'yyyyMMdd') AS DateID

, @CurrentDate AS DateStandardName

, FORMAT(@CurrentDate, 'dd/MM/yyyy') AS DateStandardEUR

, FORMAT(@CurrentDate, 'MM/dd/yyyy') AS DateStandardUS

, DATEPART(DD, @CurrentDate) AS DateStandardDay

, (CASE

WHEN

DATEPART(DW, @CurrentDate) = 1

THEN

7

ELSE

DATEPART(DW, @CurrentDate) - 1

END) AS DateStandardDayWeek

, DATEDIFF(DD, DATEADD(QQ, DATEDIFF(QQ, 0, @CurrentDate), 0), @CurrentDate) + 1 AS DateStandardDayQuarter

, DATEPART(DY, @CurrentDate) AS DateStandardDayYear

, DATEPART(WW, @CurrentDate) AS DateStandardWeek

, 'Week ' + CONVERT(VARCHAR(4), DATEPART(WW, @CurrentDate)) AS DateStandardWeekNameNL

, 'Semaine ' + CONVERT(VARCHAR(4), DATEPART(WW, @CurrentDate)) AS DateStandardWeekNameFR

, 'Week ' + CONVERT(VARCHAR(4), DATEPART(WW, @CurrentDate)) AS DateStandardWeekNameUK

, 'Woche ' + CONVERT(VARCHAR(4), DATEPART(WW, @CurrentDate)) AS DateStandardWeekNameGE

, 'Week ' + CONVERT(VARCHAR(4), DATEPART(WW, @CurrentDate)) + ' - ' + CONVERT(VARCHAR(4), DATEPART(YYYY, @CurrentDate)) AS

DateStandardWeekYearNameNL

, 'Semaine ' + CONVERT(VARCHAR(4), DATEPART(WW, @CurrentDate)) + ' - ' + CONVERT(VARCHAR(4), DATEPART(YYYY, @CurrentDate)) AS

DateStandardWeekYearNameFR

, 'Week ' + CONVERT(VARCHAR(4), DATEPART(WW, @CurrentDate)) + ' - ' + CONVERT(VARCHAR(4), DATEPART(YYYY, @CurrentDate)) AS

DateStandardWeekYearNameUK

, 'Woche ' + CONVERT(VARCHAR(4), DATEPART(WW, @CurrentDate)) + ' - ' + CONVERT(VARCHAR(4), DATEPART(YYYY, @CurrentDate)) AS

DateStandardWeekYearNameGE

, DATEPART(MM, @CurrentDate) AS DateStandardMonth

, DATEPART(QQ, @CurrentDate) AS DateStandardQuarter

, 'Kwartaal ' + CONVERT(VARCHAR(4), DATEPART(QQ, @CurrentDate)) AS DateStandardQuarterNameNL

Page 14 The importance of a date dimension in a data warehouse and BI project: SQL code

Web-IT Support and Consulting ~ [email protected]

, 'Trimestre ' + CONVERT(VARCHAR(4), DATEPART(QQ, @CurrentDate)) AS DateStandardQuarterNameFR

, 'Quarter ' + CONVERT(VARCHAR(4), DATEPART(QQ, @CurrentDate)) AS DateStandardQuarterNameUK

, 'Quartal ' + CONVERT(VARCHAR(4), DATEPART(QQ, @CurrentDate)) AS DateStandardQuarterNameGE

, 'Kwartaal ' + CONVERT(VARCHAR(4), DATEPART(QQ, @CurrentDate)) + ' - ' + CONVERT(VARCHAR(4), DATEPART(YYYY, @CurrentDate)) AS

DateStandardQuarterYearNameNL

, 'Trimestre ' + CONVERT(VARCHAR(4), DATEPART(QQ, @CurrentDate)) + ' - ' + CONVERT(VARCHAR(4), DATEPART(YYYY, @CurrentDate)) AS

DateStandardQuarterYearNameFR

, 'Quarter ' + CONVERT(VARCHAR(4), DATEPART(QQ, @CurrentDate)) + ' - ' + CONVERT(VARCHAR(4), DATEPART(YYYY, @CurrentDate)) AS

DateStandardQuarterYearNameUK

, 'Quartal ' + CONVERT(VARCHAR(4), DATEPART(QQ, @CurrentDate)) + ' - ' + CONVERT(VARCHAR(4), DATEPART(YYYY, @CurrentDate)) AS

DateStandardQuarterYearNameGE

, DATEPART(YYYY, @CurrentDate) AS DateStandardYear

, DATEADD(WK, DATEDIFF(WK, 0, @CurrentDate), 0) AS DateStandardStartWeek

, DATEADD(WK, DATEDIFF(WK, 0, @CurrentDate), 6) AS DateStandardEndWeek

, FORMAT(DATEADD(WK, DATEDIFF(WK, 0, @CurrentDate), 0), 'yyyyMMdd') AS DateStandardStartWeekID

, FORMAT(DATEADD(WK, DATEDIFF(WK, 0, @CurrentDate), 6), 'yyyyMMdd') AS DateStandardEndWeekID

, DATEADD(DD,-(DAY(@CurrentDate) - 1), @CurrentDate) AS DateStandardStartMonth

, DATEADD(DD,-(DAY(DATEADD(MM, 1, @CurrentDate))),DATEADD(MM, 1, @CurrentDate)) AS DateStandardEndMonth

, FORMAT(DATEADD(DD, -(DAY(@CurrentDate) - 1), @CurrentDate), 'yyyyMMdd') AS DateStandardStartMonthID

, FORMAT(DATEADD(DD, -(DAY(DATEADD(MM, 1, @CurrentDate))),DATEADD(MM, 1, @CurrentDate)), 'yyyyMMdd') AS DateStandardEndMonthID

, DATEADD(QQ, DATEDIFF(QQ, 0, @CurrentDate), 0) AS DateStandardStartQuarter

, DATEADD(QQ, DATEDIFF(QQ, -1, @CurrentDate), -1) AS DateStandardEndQuarter

, FORMAT(DATEADD(QQ, DATEDIFF(QQ, 0, @CurrentDate), 0), 'yyyyMMdd') AS DateStandardStartQuarterID

, FORMAT(DATEADD(QQ, DATEDIFF(QQ, -1, @CurrentDate), -1), 'yyyyMMdd') AS DateStandardEndQuarterID

, (CASE

WHEN

DATEPART(DW, @CurrentDate) = 1 OR DATEPART(DW, @CurrentDate) = 7

THEN

@WeekendColorFont

ELSE

@WeekColorFont

END) AS DateStandardColorFont

, (CASE

WHEN

DATEPART(DW, @CurrentDate) = 1 OR DATEPART(DW, @CurrentDate) = 7

THEN

@WeekendColorObject

ELSE

@WeekColorObject

END) AS DateStandardColorObject

) VwBasis

INNER JOIN TblMonth

ON VwBasis.DateStandardMonth = TblMonth.MonthID

INNER JOIN TblDay

ON VwBasis.DateStandardDayWeek = TblDay.DayID

-- End of values to insert

-- Next date in loop

SET @CurrentDate = DATEADD(DD, 1, @CurrentDate)

END

END

Page 15 The importance of a date dimension in a data warehouse and BI project: SQL code

Web-IT Support and Consulting ~ [email protected]

One vision, one goal!

Learning & sharing information never ends…