Skip to content

Instantly share code, notes, and snippets.

@justincjahn
Created January 18, 2023 20:57
Show Gist options
  • Save justincjahn/91b38ec0b4ef3743c408abdda29dc1fa to your computer and use it in GitHub Desktop.
Save justincjahn/91b38ec0b4ef3743c408abdda29dc1fa to your computer and use it in GitHub Desktop.
Dynamic Date Table in SQL Serverless
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