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