Created
January 18, 2023 20:57
-
-
Save justincjahn/91b38ec0b4ef3743c408abdda29dc1fa to your computer and use it in GitHub Desktop.
Dynamic Date Table in SQL Serverless
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
WITH cteCount as ( | |
SELECT | |
(n1.n + n10.n + n100.n + n1000.n) * -1 AS n | |
FROM | |
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS n1(n) | |
CROSS JOIN | |
(VALUES(0),(10),(20),(30),(40),(50),(60),(70),(80),(90)) AS n10(n) | |
CROSS JOIN | |
(VALUES(0),(100),(200),(300),(400),(500),(600),(700),(800),(900)) AS n100(n) | |
CROSS JOIN | |
(VALUES(0),(1000),(2000),(3000),(4000),(5000),(6000),(7000),(8000),(9000)) AS n1000(n) | |
WHERE | |
n1.n + n10.n + n100.n + n1000.n > 0 | |
UNION | |
SELECT | |
n1.n + n10.n + n100.n + n1000.n AS n | |
FROM | |
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS n1(n) | |
CROSS JOIN | |
(VALUES(0),(10),(20),(30),(40),(50),(60),(70),(80),(90)) AS n10(n) | |
CROSS JOIN | |
(VALUES(0),(100),(200),(300),(400),(500),(600),(700),(800),(900)) AS n100(n) | |
CROSS JOIN | |
(VALUES(0),(1000),(2000),(3000),(4000),(5000),(6000),(7000),(8000),(9000)) AS n1000(n) | |
) | |
, cteDates as ( | |
SELECT | |
n, | |
TheDate, | |
TheDay, | |
TheDaySuffix = CONVERT( | |
char(2), | |
CASE | |
WHEN TheDay / 10 = 1 THEN 'th' | |
ELSE CASE RIGHT(TheDay, 1) | |
WHEN '1' THEN 'st' | |
WHEN '2' THEN 'nd' | |
WHEN '3' THEN 'rd' | |
ELSE 'th' | |
END | |
END | |
), | |
TheDayName, | |
TheDayOfWeek, | |
TheDayOfWeekInMonth = CONVERT( | |
tinyint, | |
ROW_NUMBER() OVER (PARTITION BY TheFirstOfMonth, TheDayOfWeek ORDER BY TheDate) | |
), | |
TheDayOfYear, | |
IsWeekend = CASE | |
WHEN TheDayOfWeek IN ( | |
CASE @@DATEFIRST | |
WHEN 1 THEN 6 | |
WHEN 7 THEN 1 | |
END, | |
7 | |
) THEN 1 | |
ELSE 0 | |
END, | |
TheWeek, | |
TheISOweek, | |
TheFirstOfWeek = DATEADD(DAY, 1 - TheDayOfWeek, TheDate), | |
TheLastOfWeek = DATEADD(DAY, 6, DATEADD(DAY, 1 - TheDayOfWeek, TheDate)), | |
TheWeekOfMonth = CONVERT( | |
tinyint, | |
DENSE_RANK() OVER (PARTITION BY TheYear, TheMonth ORDER BY TheWeek) | |
), | |
TheMonth, | |
TheMonthName, | |
TheFirstOfMonth, | |
TheLastOfMonth = MAX(TheDate) OVER (PARTITION BY TheYear, TheMonth), | |
TheFirstOfNextMonth = DATEADD(MONTH, 1, TheFirstOfMonth), | |
TheLastOfNextMonth = DATEADD(DAY, -1, DATEADD(MONTH, 2, TheFirstOfMonth)), | |
TheQuarter, | |
TheFirstOfQuarter = MIN(TheDate) OVER (PARTITION BY TheYear, TheQuarter), | |
TheLastOfQuarter = MAX(TheDate) OVER (PARTITION BY TheYear, TheQuarter), | |
TheYear, | |
TheISOYear = TheYear - CASE | |
WHEN TheMonth = 1 AND TheISOWeek > 51 THEN 1 | |
WHEN TheMonth = 12 AND TheISOWeek = 1 THEN -1 | |
ELSE 0 | |
END, | |
TheFirstOfYear = DATEFROMPARTS(TheYear, 1, 1), | |
TheLastOfYear, | |
IsLeapYear = CONVERT( | |
bit, | |
CASE | |
WHEN (TheYear % 400 = 0) OR (TheYear % 4 = 0 AND TheYear % 100 <> 0) THEN 1 | |
ELSE 0 | |
END | |
), | |
Has53Weeks = CASE WHEN DATEPART(WEEK, TheLastOfYear) = 53 THEN 1 ELSE 0 END, | |
Has53ISOWeeks = CASE WHEN DATEPART(ISO_WEEK, TheLastOfYear) = 53 THEN 1 ELSE 0 END, | |
MMYYYY = CONVERT(char(2), CONVERT(char(8), TheDate, 101)) + CONVERT(char(4), TheYear), | |
Style101 = CONVERT(char(10), TheDate, 101), | |
Style103 = CONVERT(char(10), TheDate, 103), | |
Style112 = CONVERT(char(8), TheDate, 112), | |
Style120 = CONVERT(char(10), TheDate, 120) | |
FROM ( | |
SELECT | |
n | |
, TheDate = CONVERT(date, d) | |
, TheDay = DATEPART(DAY, d) | |
, TheDayName = DATENAME(WEEKDAY, d) | |
, TheWeek = DATEPART(WEEK, d) | |
, TheISOWeek = DATEPART(ISO_WEEK, d) | |
, TheDayOfWeek = DATEPART(WEEKDAY, d) | |
, TheMonth = DATEPART(MONTH, d) | |
, TheMonthName = DATENAME(MONTH, d) | |
, TheQuarter = DATEPART(Quarter, d) | |
, TheYear = DATEPART(YEAR, d) | |
, TheFirstOfMonth = DATEFROMPARTS(YEAR(d), MONTH(d), 1) | |
, TheLastOfYear = DATEFROMPARTS(YEAR(d), 12, 31) | |
, TheDayOfYear = DATEPART(DAYOFYEAR, d) | |
FROM ( | |
SELECT | |
n, | |
DATEADD(day, n, GETDATE()) AS d | |
FROM cteCount | |
) t1 | |
) t2 | |
) | |
SELECT * FROM cteDates | |
ORDER BY n |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment