Create and Populate Date Dimension For Data Warehouse - CodeProject
Create and Populate Date Dimension For Data Warehouse - CodeProject
articles
Q&A
forums
edmund sia
lounge
Searchforarticles,questions,tips
CPOL
Rate:
4.86 48 votes
This article shows how to create and populate date dimension for data warehouse.
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.
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.
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.
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
SelectDATEPART(MM,Getdate())as
MonthNumber
SelectDATEPART(YY,Getdate())as
YearValue
SelectDATEPART(QQ,Getdate())as
QuarterValue
SelectDATEPART(DW,Getdate())as
DayOfWeekValue
SelectCONVERT
(char(8),Getdate(),112)
SelectCONVERT
(char(10),Getdate(),103)
SelectCONVERT
(char(10),Getdate(),101)
SelectDATEPART(DD,Getdate())as
DayOfMonthValue
selectDATENAME(DW,Getdate())AS
DayName
10
selectDATEPART(WW,Getdate())AS
WeekOfYear
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.
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
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.
Search Comments
Go
First Prev Next
3Sep15 12:37
My vote of 5
Member 11907560
13Aug15 14:23
13Aug14 9:09
12Jun14 5:07
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