TECHNOLOGIES
FORUMS
JOBS
BOOKS
EVENTS
INTERVIEWS
Live
MORE
LEARN
Training
CAREER
MEMBERS
VIDEOS
NEWS
BLOGS
Sign Up
Login
No unread comment.
View All Comments
No unread message.
View All Messages
No unread notification.
View All Notifications
C# Corner
Post
An Article
A Blog
A News
A Video
An EBook
An Interview Question
Ask Question
Procedure for Creating Date Dimension and Populating it
Raghu Reddy
Apr 23
2016
Code
1.5
k
0
0
facebook
twitter
linkedIn
Reddit
WhatsApp
Email
Bookmark
expand
-----------CREATE TABLE DIM_DATE----------------DROP TABLE [DIM_DATE]
CREATE
TABLE
[DBO].[DIM_DATE]
( [DATESK]
INT
PRIMARY
KEY
,
[
DATE
] DATETIME,
[FULLDATECHAR]
CHAR
(10),
-- DATE IN MM-DD-YYYY FORMAT
[DAYOFMONTH]
VARCHAR
(2),
-- FIELD WILL HOLD DAY NUMBER OF MONTH
[DAYSUFFIX]
VARCHAR
(4),
-- APPLY SUFFIX AS 1ST, 2ND ,3RD ETC
[DAYNAME]
VARCHAR
(9),
-- CONTAINS NAME OF THE DAY, SUNDAY, MONDAY
[DAYOFWEEKUAE]
CHAR
(1),
-- FIRST DAY SATURDAY=1 AND SUNDAY=7
[DAYOFWEEKINMONTH]
VARCHAR
(2),
--1ST MONDAY OR 2ND MONDAY IN MONTH
[DAYOFWEEKINYEAR]
VARCHAR
(2),
[DAYOFQUARTER]
VARCHAR
(3),
[DAYOFYEAR]
VARCHAR
(3),
[WEEKOFMONTH]
VARCHAR
(1),
-- WEEK NUMBER OF MONTH
[WEEKOFQUARTER]
VARCHAR
(2),
--WEEK NUMBER OF THE QUARTER
[WEEKOFYEAR]
VARCHAR
(2),
--WEEK NUMBER OF THE YEAR
[
MONTH
]
VARCHAR
(2),
--NUMBER OF THE MONTH 1 TO 12
[MONTHNAME]
VARCHAR
(9),
--JANUARY, FEBRUARY ETC
[MONTHOFQUARTER]
VARCHAR
(2),
-- MONTH NUMBER BELONGS TO QUARTER
[QUARTER]
CHAR
(1),
[QUARTERNAME]
VARCHAR
(9),
--FIRST,SECOND..
[
YEAR
]
CHAR
(4),
-- YEAR VALUE OF DATE STORED IN ROW
[YEARNAME]
CHAR
(7),
--CY 2012,CY 2013
[MONTHYEAR]
CHAR
(10),
--JAN-2013,FEB-2013
[MMYYYY]
CHAR
(6),
[YYYYMM]
int
,
[FIRSTDAYOFMONTH]
DATE
,
[LASTDAYOFMONTH]
DATE
,
[FIRSTDAYOFQUARTER]
DATE
,
[LASTDAYOFQUARTER]
DATE
,
[FIRSTDAYOFYEAR]
DATE
,
[LASTDAYOFYEAR]
DATE
,
[DATEDISPLAY]
VARCHAR
(23),
[ISHOLIDAYUAE]
BIT
,
-- FLAG 1=NATIONAL HOLIDAY, 0-NO NATIONAL HOLIDAY
[ISWEEKDAY]
BIT
,
-- 0=WEEK END ,1=WEEK DAY
[HOLIDAYUAE]
VARCHAR
(50),
--NAME OF HOLIDAY IN UAE
)
/********************************************************************************************/
--SPECIFY START DATE AND END DATE HERE
--VALUE OF START DATE MUST BE LESS THAN YOUR END DATE
DECLARE
@STARTDATE DATETIME =
'01/01/2009'
--STARTING VALUE OF DATE RANGE
DECLARE
@ENDDATE DATETIME =
'01/01/2017'
--END VALUE OF DATE RANGE
--TEMPORARY VARIABLES TO HOLD THE VALUES DURING PROCESSING OF EACH DATE OF YEAR
DECLARE
@DAYOFWEEKINMONTH
INT
,
@DAYOFWEEKINYEAR
INT
,
@DAYOFQUARTER
INT
,
@WEEKOFMONTH
INT
,
@CURRENTYEAR
INT
,
@CURRENTMONTH
INT
,
@CURRENTQUARTER
INT
/*
TABLE
DATA TYPE
TO
STORE THE
DAY
OF
WEEK
COUNT
FOR
THE
MONTH
AND
YEAR
*/
DECLARE
@DAYOFWEEK
TABLE
(DOW
INT
, MONTHCOUNT
INT
, QUARTERCOUNT
INT
, YEARCOUNT
INT
)
INSERT
INTO
@DAYOFWEEK
VALUES
(1, 0, 0, 0)
INSERT
INTO
@DAYOFWEEK
VALUES
(2, 0, 0, 0)
INSERT
INTO
@DAYOFWEEK
VALUES
(3, 0, 0, 0)
INSERT
INTO
@DAYOFWEEK
VALUES
(4, 0, 0, 0)
INSERT
INTO
@DAYOFWEEK
VALUES
(5, 0, 0, 0)
INSERT
INTO
@DAYOFWEEK
VALUES
(6, 0, 0, 0)
INSERT
INTO
@DAYOFWEEK
VALUES
(7, 0, 0, 0)
--EXTRACT AND ASSIGN VARIOUS PARTS OF VALUES FROM CURRENT DATE TO VARIABLE
DECLARE
@CURRENTDATE
AS
DATETIME = @STARTDATE
SET
@CURRENTMONTH = DATEPART(MM, @CURRENTDATE)
SET
@CURRENTYEAR = DATEPART(YY, @CURRENTDATE)
SET
@CURRENTQUARTER = DATEPART(QQ, @CURRENTDATE)
/********************************************************************************************/
--PROCEED ONLY IF START DATE(CURRENT DATE ) IS LESS THAN END DATE YOU SPECIFIED ABOVE
WHILE @CURRENTDATE < @ENDDATE
BEGIN
/*
BEGIN
DAY
OF
WEEK LOGIC*/
/*
CHECK
FOR
CHANGE
IN
MONTH
OF
THE
CURRENT
DATE
IF
MONTH
CHANGED
THEN
CHANGE VARIABLE VALUE*/
IF @CURRENTMONTH != DATEPART(MM, @CURRENTDATE)
BEGIN
UPDATE
@DAYOFWEEK
SET
MONTHCOUNT = 0
SET
@CURRENTMONTH = DATEPART(MM, @CURRENTDATE)
END
/*
CHECK
FOR
CHANGE
IN
QUARTER
OF
THE
CURRENT
DATE
IF QUARTER CHANGED
THEN
CHANGE
VARIABLE VALUE*/
IF @CURRENTQUARTER != DATEPART(QQ, @CURRENTDATE)
BEGIN
UPDATE
@DAYOFWEEK
SET
QUARTERCOUNT = 0
SET
@CURRENTQUARTER = DATEPART(QQ, @CURRENTDATE)
END
/*
CHECK
FOR
CHANGE
IN
YEAR
OF
THE
CURRENT
DATE
IF
YEAR
CHANGED
THEN
CHANGE
VARIABLE VALUE*/
IF @CURRENTYEAR != DATEPART(YY, @CURRENTDATE)
BEGIN
UPDATE
@DAYOFWEEK
SET
YEARCOUNT = 0
SET
@CURRENTYEAR = DATEPART(YY, @CURRENTDATE)
END
-- SET VALUES IN TABLE DATA TYPE CREATED ABOVE FROM VARIABLES
UPDATE
@DAYOFWEEK
SET
MONTHCOUNT = MONTHCOUNT + 1,
QUARTERCOUNT = QUARTERCOUNT + 1,
YEARCOUNT = YEARCOUNT + 1
WHERE
DOW = DATEPART(DW, @CURRENTDATE)
SELECT
@DAYOFWEEKINMONTH = MONTHCOUNT,
@DAYOFQUARTER = QUARTERCOUNT,
@DAYOFWEEKINYEAR = YEARCOUNT
FROM
@DAYOFWEEK
WHERE
DOW = DATEPART(DW, @CURRENTDATE)
/*
END
DAY
OF
WEEK LOGIC*/
/* POPULATE YOUR DIMENSION
TABLE
WITH
VALUES
*/
INSERT
INTO
[DBO].[DIM_DATE]
SELECT
CONVERT
(
CHAR
(8),@CURRENTDATE,112)
AS
DATESK,
@CURRENTDATE
AS
DATE
,
CONVERT
(
CHAR
(10),@CURRENTDATE,101)
AS
FULLDATECHAR,
DATEPART(DD, @CURRENTDATE)
AS
DAYOFMONTH,
--APPLY SUFFIX VALUES LIKE 1ST, 2ND 3RD ETC..
CASE
WHEN
DATEPART(DD,@CURRENTDATE)
IN
(11,12,13)
THEN
CAST
(DATEPART(DD,@CURRENTDATE)
AS
VARCHAR
) +
'TH'
WHEN
RIGHT
(DATEPART(DD,@CURRENTDATE),1) = 1
THEN
CAST
(DATEPART(DD,@CURRENTDATE)
AS
VARCHAR
) +
'ST'
WHEN
RIGHT
(DATEPART(DD,@CURRENTDATE),1) = 2
THEN
CAST
(DATEPART(DD,@CURRENTDATE)
AS
VARCHAR
) +
'ND'
WHEN
RIGHT
(DATEPART(DD,@CURRENTDATE),1) = 3
THEN
CAST
(DATEPART(DD,@CURRENTDATE)
AS
VARCHAR
) +
'RD'
ELSE
CAST
(DATEPART(DD,@CURRENTDATE)
AS
VARCHAR
) +
'TH'
END
AS
DAYSUFFIX,
DATENAME(DW, @CURRENTDATE)
AS
DAYNAME,
-- CHECK FOR DAY OF WEEK AS PER US AND CHANGE IT AS PER UK FORMAT
DATEPART(DW, @CURRENTDATE)
AS
DAYOFWEEKUAE,
@DAYOFWEEKINMONTH
AS
DAYOFWEEKINMONTH,
@DAYOFWEEKINYEAR
AS
DAYOFWEEKINYEAR,
@DAYOFQUARTER
AS
DAYOFQUARTER,
DATEPART(DY, @CURRENTDATE)
AS
DAYOFYEAR,
DATEPART(WW, @CURRENTDATE) + 1 - DATEPART(WW,
CONVERT
(
VARCHAR
,
DATEPART(MM, @CURRENTDATE)) +
'/1/'
+
CONVERT
(
VARCHAR
,
DATEPART(YY, @CURRENTDATE)))
AS
WEEKOFMONTH,
(DATEDIFF(DD, DATEADD(QQ, DATEDIFF(QQ, 0, @CURRENTDATE), 0),
@CURRENTDATE) / 7) + 1
AS
WEEKOFQUARTER,
DATEPART(WW, @CURRENTDATE)
AS
WEEKOFYEAR,
DATEPART(MM, @CURRENTDATE)
AS
MONTH
,
DATENAME(MM, @CURRENTDATE)
AS
MONTHNAME,
CASE
WHEN
DATEPART(MM, @CURRENTDATE)
IN
(1, 4, 7, 10)
THEN
1
WHEN
DATEPART(MM, @CURRENTDATE)
IN
(2, 5, 8, 11)
THEN
2
WHEN
DATEPART(MM, @CURRENTDATE)
IN
(3, 6, 9, 12)
THEN
3
END
AS
MONTHOFQUARTER,
DATEPART(QQ, @CURRENTDATE)
AS
QUARTER,
CASE
DATEPART(QQ, @CURRENTDATE)
WHEN
1
THEN
'FIRST'
WHEN
2
THEN
'SECOND'
WHEN
3
THEN
'THIRD'
WHEN
4
THEN
'FOURTH'
END
AS
QUARTERNAME,
DATEPART(
YEAR
, @CURRENTDATE)
AS
YEAR
,
'CY '
+
CONVERT
(
VARCHAR
, DATEPART(
YEAR
, @CURRENTDATE))
AS
YEARNAME,
LEFT
(DATENAME(MM, @CURRENTDATE), 3) +
'-'
+
CONVERT
(
VARCHAR
,
DATEPART(YY, @CURRENTDATE))
AS
MONTHYEAR,
RIGHT
(
'0'
+
CONVERT
(
VARCHAR
, DATEPART(MM, @CURRENTDATE)),2) +
CONVERT
(
VARCHAR
, DATEPART(YY, @CURRENTDATE))
AS
MMYYYY,
CONVERT
(
VARCHAR
(6),@CURRENTDATE,112)
as
YYYYMM,
CONVERT
(DATETIME,
CONVERT
(
DATE
, DATEADD(DD, - (DATEPART(DD,
@CURRENTDATE) - 1), @CURRENTDATE)))
AS
FIRSTDAYOFMONTH,
CONVERT
(DATETIME,
CONVERT
(
DATE
, DATEADD(DD, - (DATEPART(DD,
(DATEADD(MM, 1, @CURRENTDATE)))), DATEADD(MM, 1,
@CURRENTDATE))))
AS
LASTDAYOFMONTH,
DATEADD(QQ, DATEDIFF(QQ, 0, @CURRENTDATE), 0)
AS
FIRSTDAYOFQUARTER,
DATEADD(QQ, DATEDIFF(QQ, -1, @CURRENTDATE), -1)
AS
LASTDAYOFQUARTER,
CONVERT
(DATETIME,
'01/01/'
+
CONVERT
(
VARCHAR
, DATEPART(YY,
@CURRENTDATE)))
AS
FIRSTDAYOFYEAR,
CONVERT
(DATETIME,
'12/31/'
+
CONVERT
(
VARCHAR
, DATEPART(YY,
@CURRENTDATE)))
AS
LASTDAYOFYEAR,
CONVERT
(
VARCHAR
(16),@CURRENTDATE,103)+
' '
+
CONVERT
(
VARCHAR
(5),@CURRENTDATE,108)
AS
DATEDISPLAY,
NULL
AS
ISHOLIDAYUAE,
CASE
DATEPART(DW, @CURRENTDATE)
WHEN
1
THEN
1
WHEN
2
THEN
1
WHEN
3
THEN
1
WHEN
4
THEN
1
WHEN
5
THEN
1
WHEN
6
THEN
0
WHEN
7
THEN
0
END
AS
ISWEEKDAY,
NULL
AS
HOLIDAYUAE
SET
@CURRENTDATE = DATEADD(DD, 1, @CURRENTDATE)
END
/********************************************************************************************/
--STEP 3.UPDATE VALUES OF HOLIDAY AS PER UK GOVERNMENT DECLARATION FOR NATIONAL HOLIDAY.
/*
UPDATE
HOLIDAY FIELD
OF
UAE
IN
DIMENSION*/
/*THANKSGIVING - FOURTH THURSDAY
IN
NOVEMBER*/
UPDATE
[DBO].[DIM_DATE]
SET
HOLIDAYUAE =
'THANKSGIVING DAY'
WHERE
[
MONTH
] = 11
AND
[DAYOFWEEKUAE] =
'THURSDAY'
AND
DAYOFWEEKINMONTH = 4
/*CHRISTMAS*/
UPDATE
[DBO].[DIM_DATE]
SET
HOLIDAYUAE =
'CHRISTMAS DAY'
WHERE
[
MONTH
] = 12
AND
[DAYOFMONTH] = 25
/*4TH
OF
JULY*/
UPDATE
[DBO].[DIM_DATE]
SET
HOLIDAYUAE =
'INDEPENDANCE DAY'
WHERE
[
MONTH
] = 7
AND
[DAYOFMONTH] = 4
/*NEW YEARS
DAY
*/
UPDATE
[DBO].[DIM_DATE]
SET
HOLIDAYUAE =
'NEW YEAR'
'S DAY'
WHERE
[
MONTH
] = 1
AND
[DAYOFMONTH] = 1
/*****************************************************************************************/
DimDate