Date post: | 09-Jan-2017 |
Category: |
Documents |
Upload: | dirk-cludts |
View: | 379 times |
Download: | 3 times |
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…