MS SQL Server Time Dimension UDF

July 24, 2007 · Filed Under Uncategorized · Comment 

I use this function when writing reports.

Use:

SELECT
	time.Date
	, Count(tab.ID) AS [Count]
FROM
	dbo.TimeDimension('1/1/2007 00:00:00', '12/31/2007 23:59:59', 'month', 1) time
	LEFT OUTER JOIN
		TempTable tab
	ON tab.DateCreated BETWEEN time.Date AND time.DateEnd

Here is the function. I don’t know if there is a better way to do this, if there is can someone tell me. As far as I know I am the only person to post a function like this.

CREATE FUNCTION [dbo].[TimeDimension] (
	@DateStart datetime
	, @DateEnd datetime
	, @Type varchar(20)
	, @IncrementValue int
)
RETURNS @Dates TABLE ( Date datetime , DateEnd datetime )
AS
BEGIN
	DECLARE @DateCurrent datetime, @NextDate datetime
	SET @DateCurrent = @DateStart

	WHILE (@DateCurrent <= @DateEnd)
	BEGIN
		SET @NextDate = CASE (@Type)
			WHEN 'year' THEN DateAdd(year, @IncrementValue, @DateCurrent)
			WHEN 'quarter' THEN DateAdd(quarter, @IncrementValue, @DateCurrent)
			WHEN 'month' THEN DateAdd(month, @IncrementValue, @DateCurrent)
			WHEN 'dayofyear' THEN DateAdd(dayofyear, @IncrementValue, @DateCurrent)
			WHEN 'day' THEN DateAdd(day, @IncrementValue, @DateCurrent)
			WHEN 'week' THEN DateAdd(week, @IncrementValue, @DateCurrent)
			WHEN 'weekday' THEN DateAdd(weekday, @IncrementValue, @DateCurrent)
			WHEN 'hour' THEN DateAdd(hour, @IncrementValue, @DateCurrent)
			WHEN 'minute' THEN DateAdd(minute, @IncrementValue, @DateCurrent)
			WHEN 'second' THEN DateAdd(second, @IncrementValue, @DateCurrent)
			WHEN 'millisecond' THEN DateAdd(millisecond, @IncrementValue, @DateCurrent)
		END

		INSERT INTO @Dates ( Date , DateEnd )
		VALUES ( @DateCurrent , DateAdd(second, -1, @NextDate) )

		SET @DateCurrent = @NextDate
	END
	RETURN
END