Just another handy code snippet for generating dates for date dimensions in your data warehouse.
I am providing just the select statement here, but to generate (massive) date records, just create and set your start and end date variables, and enclose your insert and the code below in your WHILE loop.
Here’s a table summary
Date Variation | T-SQL Code | Sample Result |
---|---|---|
Date Surrogate Key | CONVERT(VARCHAR(8), @dt, 112) |
20110210 |
WeekName | 'Week ' + CAST(DATEPART(ww, @dt) AS VARCHAR(2)) |
Week 7 |
WeekNameWithYear | 'Week ' + CAST(DATEPART(ww, @dt) AS VARCHAR(2)) + ', ' + |
Week 7, 2011 |
WeekShortName | 'WK' + RIGHT('0' + CAST(DATEPART(ww, @dt) AS VARCHAR(2)), 2) |
WK07 |
WeekShortNameWithYear | 'WK' + RIGHT('0' + CAST(DATEPART(ww, @dt) AS VARCHAR(2)), 2) + ' ' + |
WK07 2011 |
WeekNumber | DATEPART(ww, @dt) |
7 |
FirstDateOfWeek | DATEADD(dd, -1, DATEADD(ww, DATEDIFF(ww,0,@dt), 0)) |
2011-02-06 00:00:00.000 |
LastDateOfWeek | DATEADD(dd, 5, DATEADD(ww, DATEDIFF(ww,0,@dt), 0)) |
2011-02-12 00:00:00.000 |
DayOfWeek | DATEPART(dw, @dt) |
5 |
DayOfWeekName | DATENAME(dw, @dt) |
Thursday |
DayOfWeekShortName | LEFT(DATENAME(dw, @dt),3) |
Thu |
IsWeekday | CASE |
1 |
IsWeekend | CASE |
0 |
MonthName | DATENAME(mm, @dt) |
February |
MonthNameWithYear | DATENAME(mm, @dt) + ', ' + CAST(YEAR(@dt) AS CHAR(4)) |
February, 2011 |
MonthShortName | LEFT(DATENAME(mm, @dt), 3) |
Feb |
MonthShortNameWithYear | LEFT(DATENAME(mm, @dt), 3) + ' ' + CAST(YEAR(@dt) AS CHAR(4)) |
Feb 2011 |
MonthNumber | MONTH(@dt) |
2 |
FirstDateOfMonth | DATEADD(mm, DATEDIFF(mm, 0, @dt), 0) |
2011-02-01 00:00:00.000 |
LastDateOfMonth | DATEADD(dd, -1, DATEADD(mm, DATEDIFF(mm, 0, @dt) + 1, 0)) |
2011-02-28 00:00:00.000 |
DayOfMonth | DAY(@dt) |
10 |
DayOfMonthName | DATENAME(mm, @dt) + ' ' + CAST(DAY(@dt) AS VARCHAR(2)) + |
February 10th |
QuarterName | 'Quarter ' + DATENAME(qq, @dt) |
Quarter 1 |
QuarterNameWithYear | 'Quarter ' + CAST(DATEPART(qq, @dt) AS CHAR(1)) + ', ' + CAST(YEAR(@dt) AS CHAR(4)) |
Quarter 1, 2011 |
QuarterShortName |
|
Q1 |
QuarterShortNameWithYear | 'Q' + CAST(DATEPART(qq, @dt) AS CHAR(1)) + ' ' + CAST(YEAR(@dt) AS CHAR(4)) |
Q1 2011 |
QuarterNumber | DATEPART(qq, @dt) |
1 |
FirstDateOfQuarter | DATEADD(qq, DATEDIFF(qq, 0, @dt), 0) |
2011-01-01 00:00:00.000 |
LastDateOfQuarter | DATEADD(dd, -1, DATEADD(qq, DATEDIFF(qq, 0, @dt) + 1, 0)) |
2011-03-31 00:00:00.000 |
DayOfQuarter | DATEDIFF(dd, DATEADD(qq, DATEDIFF(qq, 0, @dt), 0), @dt) + 1 |
41 |
Year | (YEAR(@dt) |
|
FirstDateOfYear | DATEADD(yy, DATEDIFF(yy,0, @dt), 0) |
2011-01-01 00:00:00.000 |
LastDateOfYear | DATEADD(dd, -1, DATEADD(yy, DATEDIFF(yy,0, @dt) + 1, 0)) |
2011-12-31 00:00:00.000 |
DayOfYear | DATEPART(dy,@dt) |
41 |
DayOfYearName | DATENAME(mm, @dt) + ' ' + CAST(DAY(@dt) AS VARCHAR(2)) + |
February 10th, 2011 |
Here’s the code:
DECLARE @dt DATETIME = GETDATE() -- insert your unknowns in your dimension first SELECT --2011-02-10 01:18:55.247 @dt AS CurrentDate, -- 2011-02-10 00:00:00.000 DATEADD(dd, 0, DATEDIFF(dd, 0, @dt)) AS DateAK, -- 20110210 CONVERT(VARCHAR(8), @dt, 112) AS DateSK, -- Week 7 'Week ' + CAST(DATEPART(ww, @dt) AS VARCHAR(2)) AS WeekName, -- Week 7, 2011 'Week ' + CAST(DATEPART(ww, @dt) AS VARCHAR(2)) + ', ' + CAST(YEAR(@dt) AS VARCHAR(4)) AS WeekNameWithYear, -- WK07 'WK' + RIGHT('0' + CAST(DATEPART(ww, @dt) AS VARCHAR(2)), 2) AS WeekShortName, -- WK07 2011 'WK' + RIGHT('0' + CAST(DATEPART(ww, @dt) AS VARCHAR(2)), 2) + ' ' + CAST(YEAR(@dt) AS VARCHAR(4)) AS WeekShortNameWithYear, -- 7 DATEPART(ww, @dt) AS WeekNumber, -- Sunday of the week - 2011-02-06 00:00:00.000 DATEADD(dd, -1, DATEADD(ww, DATEDIFF(ww,0,@dt), 0)) AS FirstDateOfWeek, -- Saturday of the week - 2011-02-12 00:00:00.000 DATEADD(dd, 5, DATEADD(ww, DATEDIFF(ww,0,@dt), 0)) AS LastDateOfWeek, -- 5 DATEPART(dw, @dt) AS DayOfWeek, -- Thursday DATENAME(dw, @dt) AS DayOfWeekName, -- Thu LEFT(DATENAME(dw, @dt),3) AS DayOfWeekShortName, -- 1 CASE WHEN DATENAME(dw, @dt) IN ('Saturday', 'Sunday') THEN 0 ELSE 1 END AS IsWeekday, -- 0 CASE WHEN DATENAME(dw, @dt) IN ('Saturday', 'Sunday') THEN 1 ELSE 0 END AS IsWeekend, -- February DATENAME(mm, @dt) AS MonthName, -- February, 2011 DATENAME(mm, @dt) + ', ' + CAST(YEAR(@dt) AS CHAR(4)) AS MonthNameWithYear, -- Feb LEFT(DATENAME(mm, @dt), 3) AS MonthShortName, -- Feb 2011 LEFT(DATENAME(mm, @dt), 3) + ' ' + CAST(YEAR(@dt) AS CHAR(4)) AS MonthShortNameWithYear, -- 2 MONTH(@dt) AS MonthNumber, -- 2011-02-01 00:00:00.000 DATEADD(mm, DATEDIFF(mm, 0, @dt), 0) AS FirstDateOfMonth, -- 2011-02-28 00:00:00.000 DATEADD(dd, -1, DATEADD(mm, DATEDIFF(mm, 0, @dt) + 1, 0)) AS LastDateOfMonth, -- 10 DAY(@dt) AS DayOfMonth, -- February 10th DATENAME(mm, @dt) + ' ' + CAST(DAY(@dt) AS VARCHAR(2)) + CASE WHEN DAY(@dt) IN (1, 21, 31) THEN 'st' WHEN DAY(@dt) IN (2, 22) THEN 'nd' WHEN DAY(@dt) IN (3, 23) THEN 'rd' ELSE 'th' END AS DayOfMonthName, -- Quarter 1 'Quarter ' + DATENAME(qq, @dt) AS QuarterName, -- Quarter 1, 2011 'Quarter ' + CAST(DATEPART(qq, @dt) AS CHAR(1)) + ', ' + CAST(YEAR(@dt) AS CHAR(4)) AS QuarterNameWithYear, -- Q1 'Q' + CAST(DATEPART(qq, @dt) AS CHAR(1)) AS QuarterShortName, -- Q1 2011 'Q' + CAST(DATEPART(qq, @dt) AS CHAR(1)) + ' ' + CAST(YEAR(@dt) AS CHAR(4)) AS QuarterShortNameWithYear, -- 1 DATEPART(qq, @dt) AS QuarterNumber, -- 2011-01-01 00:00:00.000 DATEADD(qq, DATEDIFF(qq, 0, @dt), 0) AS FirstDateOfQuarter, -- 2011-03-31 00:00:00.000 DATEADD(dd, -1, DATEADD(qq, DATEDIFF(qq, 0, @dt) + 1, 0)) AS LastDateOfQuarter, -- 41 DATEDIFF(dd, DATEADD(qq, DATEDIFF(qq, 0, @dt), 0), @dt) + 1 AS DayOfQuarter, -- 2011 CAST(YEAR(@dt) AS CHAR(4)) AS YearName, -- 11 RIGHT(CAST(YEAR(@dt) AS CHAR(4)), 2) AS YearShortName, -- 2011 YEAR(@dt) AS YearNumber, -- 2011-01-01 00:00:00.000 DATEADD(yy, DATEDIFF(yy,0, @dt), 0) AS FirstDateOfYear, -- 2011-12-31 00:00:00.000 DATEADD(dd, -1, DATEADD(yy, DATEDIFF(yy,0, @dt) + 1, 0)) AS LastDateOfYear, -- 41 DATEPART(dy,@dt) AS DayOfYear, -- February 10th, 2011 DATENAME(mm, @dt) + ' ' + CAST(DAY(@dt) AS VARCHAR(2)) + CASE WHEN DAY(@dt) IN (1, 21, 31) THEN 'st' WHEN DAY(@dt) IN (2, 22) THEN 'nd' WHEN DAY(@dt) IN (3, 23) THEN 'rd' ELSE 'th' END + ', ' + CAST(YEAR(@dt) AS CHAR(4)) AS DayOfYearName
Have fun!
Different T-SQL Date Variations for Date Dimensions,
This is awesome-thanks Belle!
[…] This post was mentioned on Twitter by sqlbelle, Derek Goodridge. Derek Goodridge said: a useful post from @sqlbelle w/ TSQL to create different date variations for a Date dimension http://bit.ly/gRCjHe #SSAS #BI […]
Belle, I’d be hesitant to rely on DATENAME() – your code breaks down in other languages.
SET LANGUAGE FRENCH;
SELECT DATENAME(DW, SYSDATETIME());
SET LANGUAGE SPANISH;
SELECT DATENAME(DW, SYSDATETIME());
DATEPART() instead will give you the numbers 1-7. I would feel safer using the numbers because I think DATEFIRST settings are much more reliable/consistent than language settings.
Cheers,
Aaron
Thanks Aaron. That’s a great insight. I will take your recommendation and update the code. Much appreciated!