You are on page 1of 18

12,108,707 members 56,261 online

articles

Q&A

forums

edmund sia

lounge

158 Sign out

Searchforarticles,questions,tips

Create and Populate Date Dimension for Data


Warehouse
Mubin M. Shaikh, 4 Sep 2013

CPOL

Rate:

4.86 48 votes
This article shows how to create and populate date dimension for data warehouse.

Download script 5.3 KB

Introduction
This article will especially help those people who work in Data warehouse and Business Intelligence. Whenever as a starting
point, they need to set New Data warehouse, during this time they need to create and fill their Date Dimension with various
values of Date, Date Keys, Day Type, Day Name Of Week, Month, Month Name, Quarter, etc.
Date dimension plays an important role in your data warehouse designing, it provides the ability to study behavior and
trend of your data over a period of time.
You can study your data by grouping them using various fields of date dimension.
For example:
If I want to analyze my data of total sales by each month of the year, or show total sales by each quarter of the year, or show
me on which days total sales takes place more in the entire year or month.
After implementing the complete solution in data warehouse, the relationship of date dimension gives you all this facility to
do slice and dice of your data.
So as an initial step, you need to design your date dimension, time dimension and populate them with range of values.
For designing of time dimension, you can refer to my other tip posted on CodeProject, Design and Populate Time
Dimension with 24 Hour plus Values.
This date dimension will have values of date stored as per various date formats used across the world, like ddMMyyyy is
used in Europe, UK, India, etc. while MMddyyyy format is used in US.
Even some countries refer to Monday as 1st day of the week like UK, and some of them refer to Sunday as the 1st day of the
week like US, so I have placed both types of values in this date dimension so that it can be utilized as per the need.
National holiday list is also different in both the countries US and UK, script is there to update date dimension with these
values, it will help to study data on a particular national holiday.
I expect some intermediate knowledge of TSQL from the reader to understand and to use the script given below, even I
have placed steps to follow to achieve a particular task , TSQL script also contains in line comments to explain the purpose
of various steps.

This article contains two scripts:

Script 1
This script will create date dimension table for you and populate it with all standard values. Please refer to figure 1. You
need to follow 4 easy steps given under section of the Script 1.

Figure 1

Script 2
This script can be used to extend your date dimension with Fiscal Calendar fields like Fiscal Year, Fiscal month, fiscal Quarter,
etc and populate these fields with appropriate values, Fiscal Calendar fields can be used to study data as per Financial Year
Defined. Please refer to figure 2 for further details. Follow the steps given under section of Script 2 to accomplish this task.

Figure 2

SCRIPT 1
Follow the 4 easy steps in sequence to create and populate date dimension with values.

Using the Code


Follow the given steps to create date dimension:
1. Open SQL Server Management Studio
2. Connect Database Engine
3. Open New query editor
4. Copy paste scripts given below in various steps in new query editor window one by one
5. To run the given SQL script, press F5

Step 1
Please refer to the inline comments given with TSQL Script for further explanation of each field in table and which type of
values it will hold.

Create Table for Date Dimension


Hide Shrink

Copy Code

BEGINTRY

DROPTABLE[dbo].[DimDate]
ENDTRY
BEGINCATCH

/*NoAction*/
ENDCATCH
/**********************************************************************************/
CREATETABLE
[dbo].[DimDate]

( [DateKey]INTprimarykey,

[Date]DATETIME,

[FullDateUK]CHAR(10),DateinddMMyyyyformat

[FullDateUSA]CHAR(10),DateinMMddyyyyformat

[DayOfMonth]VARCHAR(2),FieldwillholddaynumberofMonth

[DaySuffix]VARCHAR(4),Applysuffixas1st,2nd,3rdetc

[DayName]VARCHAR(9),Containsnameoftheday,Sunday,Monday

[DayOfWeekUSA]CHAR(1),FirstDaySunday=1andSaturday=7

[DayOfWeekUK]CHAR(1),FirstDayMonday=1andSunday=7

[DayOfWeekInMonth]VARCHAR(2),1stMondayor2ndMondayinMonth

[DayOfWeekInYear]VARCHAR(2),

[DayOfQuarter]VARCHAR(3),

[DayOfYear]VARCHAR(3),

[WeekOfMonth]VARCHAR(1),WeekNumberofMonth

[WeekOfQuarter]VARCHAR(2),WeekNumberoftheQuarter

[WeekOfYear]VARCHAR(2),WeekNumberoftheYear

[Month]VARCHAR(2),NumberoftheMonth1to12

[MonthName]VARCHAR(9),January,Februaryetc

[MonthOfQuarter]VARCHAR(2),MonthNumberbelongstoQuarter

[Quarter]CHAR(1),

[QuarterName]VARCHAR(9),First,Second..

[Year]CHAR(4),YearvalueofDatestoredinRow

[YearName]CHAR(7),CY2012,CY2013

[MonthYear]CHAR(10),Jan2013,Feb2013

[MMYYYY]CHAR(6),

[FirstDayOfMonth]DATE,

[LastDayOfMonth]DATE,

[FirstDayOfQuarter]DATE,

[LastDayOfQuarter]DATE,

[FirstDayOfYear]DATE,

[LastDayOfYear]DATE,

[IsHolidayUSA]BIT,Flag1=NationalHoliday,0NoNationalHoliday

[IsWeekday]BIT,0=WeekEnd,1=WeekDay

[HolidayUSA]VARCHAR(50),NameofHolidayinUS

[IsHolidayUK]BITNull,Flag1=NationalHoliday,0NoNationalHoliday

[HolidayUK]VARCHAR(50)NullNameofHolidayinUK

)
GO

Brief introduction to functions used in script to populate Date Dimension


Function

Detail e.g. for 16Aug2013

SelectDATEPART(MM,Getdate())as
MonthNumber

Return Integer Number=8 of Month from Current Date

SelectDATEPART(YY,Getdate())as
YearValue

Return Value of the Year=2013 from Current Date

SelectDATEPART(QQ,Getdate())as
QuarterValue

Return Value of the Quarter=3 for Current Date

SelectDATEPART(DW,Getdate())as
DayOfWeekValue

Return integer Value of day=6 Friday in Week for Current


Date as per US standard

SelectCONVERT

(char(8),Getdate(),112)

Return Key=20130816 Value for current Date

SelectCONVERT
(char(10),Getdate(),103)

Return date =16/08/2013 in ddMMyyyy format, UK,


Europe

SelectCONVERT
(char(10),Getdate(),101)

Return date=08/16/2013 in MMddyyyy format, US

SelectDATEPART(DD,Getdate())as
DayOfMonthValue

Return integer Day=16 Value for Current Date

selectDATENAME(DW,Getdate())AS
DayName

Return Name=Friday of the Day for Current Date.

10

selectDATEPART(WW,Getdate())AS
WeekOfYear

Returns Value of Week in Year=33

Step 2
Populate Date dimension with values
You can specify start date and end date value of date range which you want to populate in your date dimension.
Please refer to the inline comments given with TSQL script for further explanation of steps.
Hide Shrink

Copy Code

/********************************************************************************************/
SpecifyStartDateandEnddatehere
ValueofStartDateMustbeLessthanYourEndDate
DECLARE@StartDateDATETIME='01/01/2013'StartingvalueofDateRange
DECLARE@EndDateDATETIME='01/01/2015'EndValueofDateRange
TemporaryVariablesToHoldtheValuesDuringProcessingofEachDateofYear
DECLARE

@DayOfWeekInMonthINT,

@DayOfWeekInYearINT,

@DayOfQuarterINT,

@WeekOfMonthINT,

@CurrentYearINT,

@CurrentMonthINT,

@CurrentQuarterINT
/*TableDatatypetostorethedayofweekcountforthemonthandyear*/
DECLARE@DayOfWeekTABLE(DOWINT,MonthCountINT,QuarterCountINT,YearCountINT)
INSERTINTO@DayOfWeekVALUES(1,0,0,0)
INSERTINTO@DayOfWeekVALUES(2,0,0,0)
INSERTINTO@DayOfWeekVALUES(3,0,0,0)
INSERTINTO@DayOfWeekVALUES(4,0,0,0)
INSERTINTO@DayOfWeekVALUES(5,0,0,0)
INSERTINTO@DayOfWeekVALUES(6,0,0,0)
INSERTINTO@DayOfWeekVALUES(7,0,0,0)
ExtractandassignvariouspartsofValuesfromCurrentDatetoVariable
DECLARE@CurrentDateASDATETIME=@StartDate
SET@CurrentMonth=DATEPART(MM,@CurrentDate)
SET@CurrentYear=DATEPART(YY,@CurrentDate)
SET@CurrentQuarter=DATEPART(QQ,@CurrentDate)
/********************************************************************************************/
ProceedonlyifStartDate(Currentdate)islessthanEnddateyouspecifiedabove
WHILE@CurrentDate<@EndDate

BEGIN

/*Begindayofweeklogic*/
/*CheckforChangeinMonthoftheCurrentdateifMonthchangedthen
Changevariablevalue*/

IF@CurrentMonth!=DATEPART(MM,@CurrentDate)

BEGIN

UPDATE@DayOfWeek

SETMonthCount=0

SET@CurrentMonth=DATEPART(MM,@CurrentDate)

END
/*CheckforChangeinQuarteroftheCurrentdateifQuarterchangedthenchange
Variablevalue*/

IF@CurrentQuarter!=DATEPART(QQ,@CurrentDate)

BEGIN

UPDATE@DayOfWeek

SETQuarterCount=0

SET@CurrentQuarter=DATEPART(QQ,@CurrentDate)

END

/*CheckforChangeinYearoftheCurrentdateifYearchangedthenchange
Variablevalue*/

IF@CurrentYear!=DATEPART(YY,@CurrentDate)

BEGIN

UPDATE@DayOfWeek

SETYearCount=0

SET@CurrentYear=DATEPART(YY,@CurrentDate)

END

Setvaluesintabledatatypecreatedabovefromvariables

UPDATE@DayOfWeek
SET

MonthCount=MonthCount+1,

QuarterCount=QuarterCount+1,

YearCount=YearCount+1
WHEREDOW=DATEPART(DW,@CurrentDate)

SELECT

@DayOfWeekInMonth=MonthCount,

@DayOfQuarter=QuarterCount,

@DayOfWeekInYear=YearCount

FROM@DayOfWeek

WHEREDOW=DATEPART(DW,@CurrentDate)

/*Enddayofweeklogic*/
/*PopulateYourDimensionTablewithvalues*/

INSERTINTO[dbo].[DimDate]

SELECT

CONVERT(char(8),@CurrentDate,112)asDateKey,

@CurrentDateASDate,

CONVERT(char(10),@CurrentDate,103)asFullDateUK,

CONVERT(char(10),@CurrentDate,101)asFullDateUSA,

DATEPART(DD,@CurrentDate)ASDayOfMonth,

ApplySuffixvalueslike1st,2nd3rdetc..

CASE

WHENDATEPART(DD,@CurrentDate)IN(11,12,13)_

THENCAST(DATEPART(DD,@CurrentDate)ASVARCHAR)+'th'

WHENRIGHT(DATEPART(DD,@CurrentDate),1)=1_

THENCAST(DATEPART(DD,@CurrentDate)ASVARCHAR)+'st'

WHENRIGHT(DATEPART(DD,@CurrentDate),1)=2_

THENCAST(DATEPART(DD,@CurrentDate)ASVARCHAR)+'nd'

WHENRIGHT(DATEPART(DD,@CurrentDate),1)=3_

THENCAST(DATEPART(DD,@CurrentDate)ASVARCHAR)+'rd'

ELSECAST(DATEPART(DD,@CurrentDate)ASVARCHAR)+'th'

ENDASDaySuffix,

DATENAME(DW,@CurrentDate)ASDayName,
DATEPART(DW,@CurrentDate)ASDayOfWeekUSA,

checkfordayofweekasPerUSandchangeitasperUKformat
CASEDATEPART(DW,@CurrentDate)

WHEN1THEN7

WHEN2THEN1

WHEN3THEN2

WHEN4THEN3

WHEN5THEN4

WHEN6THEN5

WHEN7THEN6

END

ASDayOfWeekUK,

@DayOfWeekInMonthASDayOfWeekInMonth,
@DayOfWeekInYearASDayOfWeekInYear,
@DayOfQuarterASDayOfQuarter,
DATEPART(DY,@CurrentDate)ASDayOfYear,
DATEPART(WW,@CurrentDate)+1DATEPART(WW,CONVERT(VARCHAR,_
DATEPART(MM,@CurrentDate))+'/1/'+CONVERT(VARCHAR,_
DATEPART(YY,@CurrentDate)))ASWeekOfMonth,
(DATEDIFF(DD,DATEADD(QQ,DATEDIFF(QQ,0,@CurrentDate),0),_
@CurrentDate)/7)+1ASWeekOfQuarter,
DATEPART(WW,@CurrentDate)ASWeekOfYear,
DATEPART(MM,@CurrentDate)ASMonth,
DATENAME(MM,@CurrentDate)ASMonthName,
CASE

WHENDATEPART(MM,@CurrentDate)IN(1,4,7,10)THEN1

WHENDATEPART(MM,@CurrentDate)IN(2,5,8,11)THEN2

WHENDATEPART(MM,@CurrentDate)IN(3,6,9,12)THEN3

ENDASMonthOfQuarter,
DATEPART(QQ,@CurrentDate)ASQuarter,
CASEDATEPART(QQ,@CurrentDate)

WHEN1THEN'First'

WHEN2THEN'Second'

WHEN3THEN'Third'

WHEN4THEN'Fourth'

ENDASQuarterName,
DATEPART(YEAR,@CurrentDate)ASYear,
'CY'+CONVERT(VARCHAR,DATEPART(YEAR,@CurrentDate))ASYearName,
LEFT(DATENAME(MM,@CurrentDate),3)+''+CONVERT(VARCHAR,_
DATEPART(YY,@CurrentDate))ASMonthYear,
RIGHT('0'+CONVERT(VARCHAR,DATEPART(MM,@CurrentDate)),2)+_
CONVERT(VARCHAR,DATEPART(YY,@CurrentDate))ASMMYYYY,
CONVERT(DATETIME,CONVERT(DATE,DATEADD(DD,(DATEPART(DD,_
@CurrentDate)1),@CurrentDate)))ASFirstDayOfMonth,
CONVERT(DATETIME,CONVERT(DATE,DATEADD(DD,(DATEPART(DD,_
(DATEADD(MM,1,@CurrentDate)))),DATEADD(MM,1,_
@CurrentDate))))ASLastDayOfMonth,
DATEADD(QQ,DATEDIFF(QQ,0,@CurrentDate),0)ASFirstDayOfQuarter,
DATEADD(QQ,DATEDIFF(QQ,1,@CurrentDate),1)ASLastDayOfQuarter,
CONVERT(DATETIME,'01/01/'+CONVERT(VARCHAR,DATEPART(YY,_
@CurrentDate)))ASFirstDayOfYear,
CONVERT(DATETIME,'12/31/'+CONVERT(VARCHAR,DATEPART(YY,_
@CurrentDate)))ASLastDayOfYear,
NULLASIsHolidayUSA,
CASEDATEPART(DW,@CurrentDate)

WHEN1THEN0

WHEN2THEN1

WHEN3THEN1

WHEN4THEN1

WHEN5THEN1

WHEN6THEN1

WHEN7THEN0

ENDASIsWeekday,
NULLASHolidayUSA,Null,Null

SET@CurrentDate=DATEADD(DD,1,@CurrentDate)
END
/********************************************************************************************/

Step3.
UpdateValuesofHolidayasperUKGovernmentDeclarationforNationalHoliday.
/*UpdateHOLIDAYfieldsofUKasperGovt.DeclarationofNationalHoliday*/

GoodFridayApril18

UPDATE[dbo].[DimDate]

SETHolidayUK='GoodFriday'

WHERE[Month]=4AND[DayOfMonth]=18
EasterMondayApril21

UPDATE[dbo].[DimDate]

SETHolidayUK='EasterMonday'

WHERE[Month]=4AND[DayOfMonth]=21
EarlyMayBankHolidayMay5
UPDATE[dbo].[DimDate]

SETHolidayUK='EarlyMayBankHoliday'

WHERE[Month]=5AND[DayOfMonth]=5
SpringBankHolidayMay26

UPDATE[dbo].[DimDate]

SETHolidayUK='SpringBankHoliday'

WHERE[Month]=5AND[DayOfMonth]=26
SummerBankHolidayAugust25
UPDATE[dbo].[DimDate]

SETHolidayUK='SummerBankHoliday'

WHERE[Month]=8AND[DayOfMonth]=25
BoxingDayDecember26

UPDATE[dbo].[DimDate]

SETHolidayUK='BoxingDay'

WHERE[Month]=12AND[DayOfMonth]=26

CHRISTMAS

UPDATE[dbo].[DimDate]

SETHolidayUK='ChristmasDay'

WHERE[Month]=12AND[DayOfMonth]=25
NewYearsDay

UPDATE[dbo].[DimDate]

SETHolidayUK='NewYear''sDay'

WHERE[Month]=1AND[DayOfMonth]=1
UpdateflagforUKHolidays1=Holiday,0=NoHoliday

UPDATE[dbo].[DimDate]

SETIsHolidayUK=CASEWHENHolidayUKISNULL_

THEN0WHENHolidayUKISNOTNULLTHEN1END

Step4.
UpdateValuesofHolidayasperUSAGovt.DeclarationforNationalHoliday.
/*UpdateHOLIDAYFieldofUSAIndimension*/

/*THANKSGIVINGFourthTHURSDAYinNovember*/

UPDATE[dbo].[DimDate]

SETHolidayUSA='ThanksgivingDay'

WHERE

[Month]=11
AND[DayOfWeekUSA]='Thursday'
ANDDayOfWeekInMonth=4

/*CHRISTMAS*/
UPDATE[dbo].[DimDate]

SETHolidayUSA='ChristmasDay'

WHERE[Month]=12AND[DayOfMonth]=25

/*4thofJuly*/
UPDATE[dbo].[DimDate]

SETHolidayUSA='IndependanceDay'
WHERE[Month]=7AND[DayOfMonth]=4

/*NewYearsDay*/
UPDATE[dbo].[DimDate]

SETHolidayUSA='NewYear''sDay'
WHERE[Month]=1AND[DayOfMonth]=1

/*MemorialDayLastMondayinMay*/
UPDATE[dbo].[DimDate]

SETHolidayUSA='MemorialDay'
FROM[dbo].[DimDate]
WHEREDateKeyIN

SELECT

MAX(DateKey)

FROM[dbo].[DimDate]

WHERE

[MonthName]='May'

AND[DayOfWeekUSA]='Monday'

GROUPBY

[Year],

[Month]

/*LaborDayFirstMondayinSeptember*/
UPDATE[dbo].[DimDate]

SETHolidayUSA='LaborDay'
FROM[dbo].[DimDate]
WHEREDateKeyIN

SELECT

MIN(DateKey)

FROM[dbo].[DimDate]

WHERE

[MonthName]='September'

AND[DayOfWeekUSA]='Monday'

GROUPBY

[Year],

[Month]

/*Valentine'sDay*/
UPDATE[dbo].[DimDate]

SETHolidayUSA='Valentine''sDay'
WHERE

[Month]=2

AND[DayOfMonth]=14

/*SaintPatrick'sDay*/
UPDATE[dbo].[DimDate]

SETHolidayUSA='SaintPatrick''sDay'
WHERE

[Month]=3

AND[DayOfMonth]=17

/*MartinLuthorKingDayThirdMondayinJanuarystartingin1983*/
UPDATE[dbo].[DimDate]

SETHolidayUSA='MartinLuthorKingJrDay'
WHERE

[Month]=1

AND[DayOfWeekUSA]='Monday'

AND[Year]>=1983

ANDDayOfWeekInMonth=3

/*President'sDayThirdMondayinFebruary*/
UPDATE[dbo].[DimDate]

SETHolidayUSA='President''sDay'
WHERE

[Month]=2

AND[DayOfWeekUSA]='Monday'

ANDDayOfWeekInMonth=3

/*Mother'sDaySecondSundayofMay*/
UPDATE[dbo].[DimDate]

SETHolidayUSA='Mother''sDay'
WHERE

[Month]=5

AND[DayOfWeekUSA]='Sunday'

ANDDayOfWeekInMonth=2

/*Father'sDayThirdSundayofJune*/
UPDATE[dbo].[DimDate]

SETHolidayUSA='Father''sDay'
WHERE

[Month]=6

AND[DayOfWeekUSA]='Sunday'

ANDDayOfWeekInMonth=3

/*Halloween10/31*/
UPDATE[dbo].[DimDate]

SETHolidayUSA='Halloween'
WHERE

[Month]=10

AND[DayOfMonth]=31

/*ElectionDayThefirstTuesdayafterthefirstMondayinNovember*/
BEGIN
DECLARE@HolidaysTABLE(IDINTIDENTITY(1,1),_
DateIDint,WeekTINYINT,YEARCHAR(4),DAYCHAR(2))

INSERTINTO@Holidays(DateID,[Year],[Day])
SELECT

DateKey,

[Year],

[DayOfMonth]
FROM[dbo].[DimDate]
WHERE

[Month]=11

AND[DayOfWeekUSA]='Monday'
ORDERBY

YEAR,

DayOfMonth

DECLARE@CNTRINT,@POSINT,@STARTYEARINT,@ENDYEARINT,@MINDAYINT

SELECT

@CURRENTYEAR=MIN([Year])

,@STARTYEAR=MIN([Year])

,@ENDYEAR=MAX([Year])
FROM@Holidays

WHILE@CURRENTYEAR<=@ENDYEAR
BEGIN

SELECT@CNTR=COUNT([Year])

FROM@Holidays

WHERE[Year]=@CURRENTYEAR

SET@POS=1

WHILE@POS<=@CNTR
BEGIN

SELECT@MINDAY=MIN(DAY)

FROM@Holidays

WHERE

[Year]=@CURRENTYEAR

AND[Week]ISNULL

SELECT@POS=@POS+1
END

SELECT@CURRENTYEAR=@CURRENTYEAR+1
END

UPDATE@Holidays

SET[Week]=@POS
WHERE

[Year]=@CURRENTYEAR

AND[Day]=@MINDAY

UPDATE[dbo].[DimDate]

SETHolidayUSA='ElectionDay'

FROM[dbo].[DimDate]DT

JOIN@HolidaysHLON(HL.DateID+1)=DT.DateKey

WHERE

[Week]=1

END

setflagforUSAholidaysinDimension

UPDATE[dbo].[DimDate]
SETIsHolidayUSA=CASEWHENHolidayUSAISNULLTHEN0WHENHolidayUSAISNOTNULLTHEN1END
/*****************************************************************************************/
SELECT*FROM[dbo].[DimDate]

SCRIPT 2
Extension of date dimension with fiscal calendar fields like Fiscal Year, Fiscal Month, and Fiscal Quarter, etc.

Using the Code


Follow the given steps to add new fields related to Fiscal calendar in date dimension and populate them with values.
1. Open SQL Server Management Studio
2. Connect Database Engine
3. Open New query editor
4. Copy paste scripts given below in sequence of one by one
5. To run the given SQL Script, press F5

Step 1
Add new Fields in Date dimension related to Fiscal Calendar
Hide Copy Code

/*AddFiscalCalendarcolumnsintotableDimDate*/
ALTERTABLE[dbo].[DimDate]ADD

[FiscalDayOfYear]VARCHAR(3),

[FiscalWeekOfYear]VARCHAR(3),

[FiscalMonth]VARCHAR(2),

[FiscalQuarter]CHAR(1),

[FiscalQuarterName]VARCHAR(9),

[FiscalYear]CHAR(4),
[FiscalYearName]CHAR(7),
[FiscalMonthYear]CHAR(10),
[FiscalMMYYYY]CHAR(6),
[FiscalFirstDayOfMonth]DATE,
[FiscalLastDayOfMonth]DATE,
[FiscalFirstDayOfQuarter]DATE,
[FiscalLastDayOfQuarter]DATE,
[FiscalFirstDayOfYear]DATE,
[FiscalLastDayOfYear]DATE
GO

Step 2
Populate Fiscal Calendar fields in Dim date table
Hide Shrink

Copy Code

/***************************************************************************
Thefollowingsectionneedstobepopulatedfordefiningthefiscalcalendar
***************************************************************************/
DECLARE

@dtFiscalYearStartSMALLDATETIME='January01,1995',

@FiscalYearINT=1995,

@LastYearINT=2025,

@FirstLeapYearInPeriodINT=1996
/*****************************************************************************************/
DECLARE

@iTempINT,

@LeapWeekINT,

@CurrentDateDATETIME,

@FiscalDayOfYearINT,

@FiscalWeekOfYearINT,

@FiscalMonthINT,

@FiscalQuarterINT,

@FiscalQuarterNameVARCHAR(10),

@FiscalYearNameVARCHAR(7),

@LeapYearINT,

@FiscalFirstDayOfYearDATE,

@FiscalFirstDayOfQuarterDATE,

@FiscalFirstDayOfMonthDATE,

@FiscalLastDayOfYearDATE,

@FiscalLastDayOfQuarterDATE,

@FiscalLastDayOfMonthDATE
/*Holdstheyearsthathave455inlastquarter*/
DECLARE@LeapTableTABLE(leapyearINT)
/*TABLEtocontainthefiscalyearcalendar*/
DECLARE@tbTABLE(

PeriodDateDATETIME,

[FiscalDayOfYear]VARCHAR(3),

[FiscalWeekOfYear]VARCHAR(3),

[FiscalMonth]VARCHAR(2),

[FiscalQuarter]VARCHAR(1),

[FiscalQuarterName]VARCHAR(9),

[FiscalYear]VARCHAR(4),

[FiscalYearName]VARCHAR(7),

[FiscalMonthYear]VARCHAR(10),

[FiscalMMYYYY]VARCHAR(6),

[FiscalFirstDayOfMonth]DATE,

[FiscalLastDayOfMonth]DATE,

[FiscalFirstDayOfQuarter]DATE,

[FiscalLastDayOfQuarter]DATE,
[FiscalFirstDayOfYear]DATE,
[FiscalLastDayOfYear]DATE)

/*Populatethetablewithallleapyears*/
SET@LeapYear=@FirstLeapYearInPeriod
WHILE(@LeapYear<@LastYear)

BEGIN

INSERTINTO@leapTableVALUES(@LeapYear)

SET@LeapYear=@LeapYear+5

END
/*Initiateparametersbeforeloop*/
SET@CurrentDate=@dtFiscalYearStart
SET@FiscalDayOfYear=1
SET@FiscalWeekOfYear=1
SET@FiscalMonth=1
SET@FiscalQuarter=1
SET@FiscalWeekOfYear=1
IF(EXISTS(SELECT*FROM@LeapTableWHERE@FiscalYear=leapyear))

BEGIN

SET@LeapWeek=1

END

ELSE

BEGIN

SET@LeapWeek=0

END
/*******************************************************************************************/
/*Loopondaysininterval*/
WHILE(DATEPART(yy,@CurrentDate)<=@LastYear)
BEGIN

/*SETfiscalMonth*/

SELECT@FiscalMonth=CASE

/*Usethissectionfora454calendar.

Everyleapyeartheresultwillbea455*/

WHEN@FiscalWeekOfYearBETWEEN1AND4THEN1/*4weeks*/

WHEN@FiscalWeekOfYearBETWEEN5AND9THEN2/*5weeks*/

WHEN@FiscalWeekOfYearBETWEEN10AND13THEN3/*4weeks*/

WHEN@FiscalWeekOfYearBETWEEN14AND17THEN4/*4weeks*/

WHEN@FiscalWeekOfYearBETWEEN18AND22THEN5/*5weeks*/

WHEN@FiscalWeekOfYearBETWEEN23AND26THEN6/*4weeks*/

WHEN@FiscalWeekOfYearBETWEEN27AND30THEN7/*4weeks*/

WHEN@FiscalWeekOfYearBETWEEN31AND35THEN8/*5weeks*/

WHEN@FiscalWeekOfYearBETWEEN36AND39THEN9/*4weeks*/

WHEN@FiscalWeekOfYearBETWEEN40AND43THEN10/*4weeks*/

WHEN@FiscalWeekOfYearBETWEEN44AND(48+@LeapWeek)THEN11
/*5weeks*/

WHEN@FiscalWeekOfYearBETWEEN(49+@LeapWeek)AND(52+@LeapWeek)THEN12
/*4weeks(5weeksonleapyear)*/

/*Usethissectionfora445calendar.
Everyleapyeartheresultwillbea455*/

/*

WHEN@FiscalWeekOfYearBETWEEN1AND4THEN1/*4weeks*/

WHEN@FiscalWeekOfYearBETWEEN5AND8THEN2/*4weeks*/

WHEN@FiscalWeekOfYearBETWEEN9AND13THEN3/*5weeks*/

WHEN@FiscalWeekOfYearBETWEEN14AND17THEN4/*4weeks*/

WHEN@FiscalWeekOfYearBETWEEN18AND21THEN5/*4weeks*/

WHEN@FiscalWeekOfYearBETWEEN22AND26THEN6/*5weeks*/

WHEN@FiscalWeekOfYearBETWEEN27AND30THEN7/*4weeks*/

WHEN@FiscalWeekOfYearBETWEEN31AND34THEN8/*4weeks*/

WHEN@FiscalWeekOfYearBETWEEN35AND39THEN9/*5weeks*/

WHEN@FiscalWeekOfYearBETWEEN40AND43THEN10/*4weeks*/

WHEN@FiscalWeekOfYearBETWEEN44AND_

WHEN@FiscalWeekOfYearBETWEEN44AND_

(47+@leapWeek)THEN11/*4weeks(5weeksonleapyear)*/
WHEN@FiscalWeekOfYearBETWEEN(48+@leapWeek)AND(52+@leapWeek)THEN12/*5weeks*/

*/

END

/*SETFiscalQuarter*/
SELECT@FiscalQuarter=CASE

WHEN@FiscalMonthBETWEEN1AND3THEN1

WHEN@FiscalMonthBETWEEN4AND6THEN2

WHEN@FiscalMonthBETWEEN7AND9THEN3

WHEN@FiscalMonthBETWEEN10AND12THEN4
END

SELECT@FiscalQuarterName=CASE

WHEN@FiscalMonthBETWEEN1AND3THEN'First'

WHEN@FiscalMonthBETWEEN4AND6THEN'Second'

WHEN@FiscalMonthBETWEEN7AND9THEN'Third'

WHEN@FiscalMonthBETWEEN10AND12THEN'Fourth'
END

/*SetFiscalYearName*/
SELECT@FiscalYearName='FY'+CONVERT(VARCHAR,@FiscalYear)

INSERTINTO@tb(PeriodDate,FiscalDayOfYear,FiscalWeekOfYear,_
fiscalMonth,FiscalQuarter,FiscalQuarterName,FiscalYear,FiscalYearName)VALUES
(@CurrentDate,@FiscalDayOfYear,@FiscalWeekOfYear,@FiscalMonth,_
@FiscalQuarter,@FiscalQuarterName,@FiscalYear,@FiscalYearName)

/*SETnextday*/
SET@CurrentDate=DATEADD(dd,1,@CurrentDate)
SET@FiscalDayOfYear=@FiscalDayOfYear+1
SET@FiscalWeekOfYear=((@FiscalDayOfYear1)/7)+1

IF(@FiscalWeekOfYear>(52+@LeapWeek))

BEGIN

/*Resetanewyear*/

SET@FiscalDayOfYear=1

SET@FiscalWeekOfYear=1

SET@FiscalYear=@FiscalYear+1

IF(EXISTS(SELECT*FROM@leapTableWHERE@FiscalYear=leapyear))

BEGIN

SET@LeapWeek=1

END

ELSE

BEGIN

SET@LeapWeek=0

END

END
END
/********************************************************************************************/
/*Setfirstandlastdaysofthefiscalmonths*/
UPDATE@tb
SET

FiscalFirstDayOfMonth=minmax.StartDate,

FiscalLastDayOfMonth=minmax.EndDate
FROM
@tbt,

SELECTFiscalMonth,FiscalQuarter,FiscalYear,_

MIN(PeriodDate)ASStartDate,MAX(PeriodDate)ASEndDate

FROM@tb

GROUPBYFiscalMonth,FiscalQuarter,FiscalYear

)minmax
WHERE

t.FiscalMonth=minmax.FiscalMonthAND

t.FiscalQuarter=minmax.FiscalQuarterAND

t.FiscalYear=minmax.FiscalYear

t.FiscalYear=minmax.FiscalYear

/*Setfirstandlastdaysofthefiscalquarters*/
UPDATE@tb
SET

FiscalFirstDayOfQuarter=minmax.StartDate,

FiscalLastDayOfQuarter=minmax.EndDate
FROM
@tbt,

SELECTFiscalQuarter,FiscalYear,min(PeriodDate)_

asStartDate,max(PeriodDate)asEndDate

FROM@tb

GROUPBYFiscalQuarter,FiscalYear

)minmax
WHERE

t.FiscalQuarter=minmax.FiscalQuarterAND

t.FiscalYear=minmax.FiscalYear
/*Setfirstandlastdaysofthefiscalyears*/
UPDATE@tb
SET

FiscalFirstDayOfYear=minmax.StartDate,

FiscalLastDayOfYear=minmax.EndDate
FROM
@tbt,

SELECTFiscalYear,min(PeriodDate)asStartDate,max(PeriodDate)asEndDate

FROM@tb

GROUPBYFiscalYear

)minmax
WHERE

t.FiscalYear=minmax.FiscalYear
/*SetFiscalYearMonth*/
UPDATE@tb
SET

FiscalMonthYear=

CASEFiscalMonth

WHEN1THEN'Jan'

WHEN2THEN'Feb'

WHEN3THEN'Mar'

WHEN4THEN'Apr'

WHEN5THEN'May'

WHEN6THEN'Jun'

WHEN7THEN'Jul'

WHEN8THEN'Aug'

WHEN9THEN'Sep'

WHEN10THEN'Oct'

WHEN11THEN'Nov'

WHEN12THEN'Dec'

END+''+CONVERT(VARCHAR,FiscalYear)
/*SetFiscalMMYYYY*/
UPDATE@tb
SET

FiscalMMYYYY=RIGHT('0'+CONVERT(VARCHAR,FiscalMonth),2)+CONVERT(VARCHAR,FiscalYear)
/********************************************************************************************/
UPDATE[dbo].[DimDate]

SET

FiscalDayOfYear=a.FiscalDayOfYear

,FiscalWeekOfYear=a.FiscalWeekOfYear

,FiscalMonth=a.FiscalMonth

,FiscalQuarter=a.FiscalQuarter

,FiscalQuarterName=a.FiscalQuarterName

,FiscalYear=a.FiscalYear

,FiscalYearName=a.FiscalYearName


,FiscalYearName=a.FiscalYearName

,FiscalMonthYear=a.FiscalMonthYear

,FiscalMMYYYY=a.FiscalMMYYYY

,FiscalFirstDayOfMonth=a.FiscalFirstDayOfMonth

,FiscalLastDayOfMonth=a.FiscalLastDayOfMonth

,FiscalFirstDayOfQuarter=a.FiscalFirstDayOfQuarter

,FiscalLastDayOfQuarter=a.FiscalLastDayOfQuarter

,FiscalFirstDayOfYear=a.FiscalFirstDayOfYear

,FiscalLastDayOfYear=a.FiscalLastDayOfYear
FROM@tba

INNERJOIN[dbo].[DimDate]bONa.PeriodDate=b.[Date]
/********************************************************************************************/
SELECT*FROM[dbo].[DimDate]
Enjoy TSQLization.

License
This article, along with any associated source code and files, is licensed under The Code Project Open License CPOL

Share
EMAIL

TWITTER

About the Author

Mubin M. Shaikh
Team Leader
India
Microsoft Certified Professional Microsoft Certification ID: 8918672.
Design and Develop Business Intelligence Solutions using Microsoft BI.
SQL Integration Services SSIS, SQL Analysis Services SSAS, Reporting Services SSRS,SQLServer,Dimension
Modelling,Data Warehouse,Power Pivot, Power View, Power Map, Power query,.Net,C#,WCF
Linked In Profile:
Click Here to View Linked In Profile

Change Will Not Come If We Wait for Some Other Person,or Wait for Some Other Time, We are the One We are Waiting
For,We are the Change That we Seek.

You may also be interested in...


Create First Data WareHouse

Best Practices for Microsoft


Sharepoint Backup and
Restore

Create & Populate Time


Dimension with 24 Hour+
Values

Game On: Intel Edison with


the Xadow Wearable Kit

Creating Date dimension


from scratch in Microsoft
SSAS

Fun with the Arduino 101 Genuino 101

Comments and Discussions

Add a Comment or Question

Search Comments

Go
First Prev Next

Just a little note


jacktric 22Dec15 4:13
Nice One
Saintgr8 24Sep15 16:10
My vote of 5
Member 11957129

3Sep15 12:37

My vote of 5
Member 11907560

13Aug15 14:23

UK Holidays are WRONG


gary kind 13Aug15 3:58
how to add school year
Member 11764113 22Jun15 12:22
Re: how to add school year
Mubin M. Shaikh 26Jun15 2:31

Month as a varchar why ???


Member 11505078 29Mar15 2:46
Leap Year and Day of Year for Fiscal sections
Member 9911171 6Mar15 9:34
Re: Leap Year and Day of Year for Fiscal sections
Member 11607206 15Apr15 11:21
Another Option for Holidays
kitjosh1050 14Feb15 7:09
Could you please provide the MySQL Script for the same?
Member 11388946 29Jan15 10:10
Week of Year
milenalukic 6Jan15 8:18
Bug with US Holidays
Member 11275646 30Nov14 20:17
Issue with Fiscal Year
Tony Dong 24Sep14 19:39
Many thanks
Patrick.MB 16Aug14 0:09
Many Thanks
srinivasgandhimhs

13Aug14 9:09

Unbelievably Useful Thanks!


Marcus.mcdowell 18Jul14 7:11
Issue with Fiscal year
Member 10890333 17Jun14 11:45
Time change during a year
Jorge Enrique Choy Pernia

12Jun14 5:07

How/When to load the Date Dimension


baersteven 8May14 13:25
Re: How/When to load the Date Dimension
kitjosh1050 23Dec14 13:04
Sample Date Dimension
javidhkhan 17Apr14 13:36
Thank You!
Member 10748423

14Apr14 13:30

UK Bank Holidays
Dan Thompson 3Apr14 16:35
Refresh

1 2 Next

General
Admin

News

Suggestion

Question

Bug

Answer

Joke

Praise

Rant

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.
Permalink | Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.160217.1 | Last Updated 4 Sep 2013

Select Language

Layout: fixed | fluid

Article Copyright 2013 by Mubin M. Shaikh


Everything else Copyright CodeProject, 19992016

You might also like