This is a follow-up to my article How to generate a date sequence in T-SQL.
In my experience, it is frequently required to map data to points in time – display data on a periodic schedule, aggregate access log data by time intervals and so on. It goes without saying that this mapping should be handled as quick as possible. Of course performance matters.
In my previous post I discussed a method to generate these time points on-the-fly. Here I present a full solution for pre-generating a number sequence and generate a date sequence from it (which might be stored in a table as well).
If you ever had the pleasure to run queries over an access log I bet you had a desperate need for a date sequence to map query results to.
There are plenty of pages out there discussing the best way to create and populate number tables. After reading this great post on stack overflow I came up with a slight variation of one of the solutions mentioned there, like so:
DECLARE @fromDate DATETIME = '2014-01-01'
DECLARE @toDate DATETIME = '2014-09-30'
SELECT datum = DATEADD(DAY, number - 1, @FromDate)
SELECT number = CAST(number AS INT)
SELECT number = ROW_NUMBER() OVER (ORDER BY v1.number)
FROM master..spt_values AS v1
CROSS JOIN (SELECT number FROM master..spt_values) AS v2
) AS vu
WHERE number BETWEEN 1 AND DATEDIFF(DAY, @fromDate, DATEADD(DAY, 1, @toDate))
) AS u
This returns 273 records with dates from Jan, 1 2014 to Sep, 30 2014.
The advantages of this solution are: