CREATE TABLE dimDate
(
dateID int IDENTITY(1,1) PRIMARY KEY NOT NULL,
fullDate datetime NOT NULL,
dayNumOfWeek tinyint NOT NULL,
dayNameOfWeek char(9) NOT NULL, — dayName is reserved word
dayNumOfMonth tinyint NOT NULL,
dayNumOfYear smallint NOT NULL,
monthNumOfYear tinyint NOT NULL,
monthNameOfYear char(12) NOT NULL,
monthOfQuarter tinyint NOT NULL,
calendarQuarter tinyint NOT NULL,
calendarSemester tinyint NOT NULL,
calendarYear char(4) NOT NULL
)
–*/
DECLARE @maxDateAlreadyLoaded datetime
DECLARE @dayNumOfWeek tinyint
DECLARE @dayNameOfWeek char(9) — dayName is reserved word
DECLARE @dayNumOfMonth tinyint
DECLARE @dayNumOfYear smallint
DECLARE @monthNumOfYear tinyint
DECLARE @monthNameOfYear char(12)
DECLARE @monthOfQuarter tinyint
DECLARE @calendarQuarter tinyint
declare @calendarSemester tinyint
DECLARE @calendarYear char(4)
DECLARE @endDate datetime
– Preload the date by check the data in the table for highest date already
–loaded
IF EXISTS(SELECT fullDate FROM dimDate)
SET @maxDateAlreadyLoaded = (SELECT TOP 1 DATEADD(day,1,fullDate) FROM
dimDate ORDER BY dateID DESC)
ELSE
– here you Initialize the startdate of the Time Table
SET @maxDateAlreadyLoaded = ’1/1/2000′
– Initialize the endDate to one year beyond the start value
– here you can Initialize the end year from the startdate in these case it will be 2029
SET @endDate = DATEADD(year, 29, @maxDateAlreadyLoaded)
– Initialize loop to load one year worth of data
WHILE (@maxDateAlreadyLoaded < @endDate)
BEGIN
– Calculate each of the fields (simplifies INSERT statement)
SET @dayNumOfWeek = DATEPART(weekDay, @maxDateAlreadyLoaded)
SET @dayNameOfWeek = (SELECT CASE
WHEN DATEPART(weekDay, @maxDateAlreadyLoaded)= 1 THEN ‘Sunday’
WHEN DATEPART(weekDay, @maxDateAlreadyLoaded)= 2 THEN ‘Monday’
WHEN DATEPART(weekDay, @maxDateAlreadyLoaded)= 3 THEN ‘Tuesday’
WHEN DATEPART(weekDay, @maxDateAlreadyLoaded)= 4 THEN ‘Wednesday’
WHEN DATEPART(weekDay, @maxDateAlreadyLoaded)= 5 THEN ‘Thursday’
WHEN DATEPART(weekDay, @maxDateAlreadyLoaded)= 6 THEN ‘Friday’
WHEN DATEPART(weekDay, @maxDateAlreadyLoaded)= 7 THEN ‘Saturday’
END)
SET @dayNumOfMonth = DAY(@maxDateAlreadyLoaded)
SET @dayNumOfYear = DATEPART(dayOfYear, @maxDateAlreadyLoaded)
SET @monthNumOfYear = MONTH(@maxDateAlreadyLoaded)
SET @monthNameOfYear = (SELECT CASE
WHEN MONTH(@maxDateAlreadyLoaded) = 1 THEN ‘January’
WHEN MONTH(@maxDateAlreadyLoaded) = 2 THEN ‘February’
WHEN MONTH(@maxDateAlreadyLoaded) = 3 THEN ‘March’
WHEN MONTH(@maxDateAlreadyLoaded) = 4 THEN ‘April’
WHEN MONTH(@maxDateAlreadyLoaded) = 5 THEN ‘May’
WHEN MONTH(@maxDateAlreadyLoaded) = 6 THEN ‘June’
WHEN MONTH(@maxDateAlreadyLoaded) = 7 THEN ‘July’
WHEN MONTH(@maxDateAlreadyLoaded) = 8 THEN ‘August’
WHEN MONTH(@maxDateAlreadyLoaded) = 9 THEN ‘September’
WHEN MONTH(@maxDateAlreadyLoaded) = 10 THEN ‘October’
WHEN MONTH(@maxDateAlreadyLoaded) = 11 THEN ‘November’
WHEN MONTH(@maxDateAlreadyLoaded) = 12 THEN ‘December’
END)
SET @monthOfQuarter = (SELECT CASE
WHEN MONTH(@maxDateAlreadyLoaded) IN(1,4,7,10) THEN 1
WHEN MONTH(@maxDateAlreadyLoaded) IN(2,5,8,11) THEN 2
WHEN MONTH(@maxDateAlreadyLoaded) IN(3,6,9,12) THEN 3
END)
SET @calendarQuarter = DATEPART(quarter, @maxDateAlreadyLoaded)
SET @calendarSemester = (SELECT CASE
WHEN MONTH(@maxDateAlreadyLoaded) IN(1,2,3,4,5,6) THEN 1
WHEN MONTH(@maxDateAlreadyLoaded) IN(7,8,9,10,11,12) THEN 2
end)
SET @calendarYear = YEAR(@maxDateAlreadyLoaded)
–/*
– Used the PRINTS to test values as script designed
PRINT ‘———– New Row ———–’
PRINT ‘@maxDateAlreadyLoaded ‘ + CAST(@maxDateAlreadyLoaded as varchar(20))
PRINT ‘@dayNumOfWeek ‘ + CAST(@dayNumOfWeek as varchar(20))
PRINT ‘@dayNameOfWeek ‘ + CAST(@dayNameOfWeek as varchar(20))
PRINT ‘@dayNumOfMonth ‘ + CAST(@dayNumOfMonth as varchar(20))
PRINT ‘@dayNumOfYear ‘ + CAST(@dayNumOfYear as varchar(20))
PRINT ‘@monthNumOfYear ‘ + CAST(@monthNumOfYear as varchar(20))
PRINT ‘@monthNameOfYear ‘ + CAST(@monthNameOfYear as varchar(20))
PRINT ‘@monthOfQuarter ‘ + CAST(@monthOfQuarter as varchar(20))
PRINT ‘@calendarQuarter ‘ + CAST(@calendarQuarter as varchar(20))
PRINT ‘@calendarYear ‘ + CAST(@calendarYear as varchar(20))
PRINT ‘@endDate ‘ + CAST(@endDate as varchar(20))
PRINT ”
–*/
– Load row into database
INSERT INTO dimDate
(fullDate, dayNumOfWeek, dayNameOfWeek, dayNumOfMonth, dayNumOfYear,
monthNumOfYear, monthNameOfYear, monthOfQuarter, calendarQuarter,
calendarSemester,
calendarYear)
VALUES
(@maxDateAlreadyLoaded, @dayNumOfWeek, @dayNameOfWeek, @dayNumOfMonth,
@dayNumOfYear,
@monthNumOfYear, @monthNameOfYear, @monthOfQuarter, @calendarQuarter,
@calendarSemester,
@calendarYear)
– Increase the date to load by one
SET @maxDateAlreadyLoaded = DATEADD(day, 1, @maxDateAlreadyLoaded)
END