I think the use of functions is quite simple, and I did not notice big performance implications, although the cursor probably transforms better, depending on how many lines exist between them.
CREATE TABLE TEST_TIMES (EventTime datetime)
CREATE FUNCTION fn_MyTimes ( @StartTime datetime, @EndTime datetime, @Minutes int )
RETURNS @TimeTable TABLE (TimeValue datetime)
AS BEGIN
DECLARE @CurrentTime datetime
SET @CurrentTime = @StartTime
WHILE @CurrentTime <= @EndTime
BEGIN
INSERT INTO @TimeTable VALUES (@CurrentTime)
SET @CurrentTime = DATEADD(minute, @Minutes, @CurrentTime)
END
RETURN
END
CREATE FUNCTION fn_ClosestTime ( @CheckTime datetime )
RETURNS datetime
AS BEGIN
DECLARE @LowerTime datetime, @HigherTime datetime
SELECT @LowerTime = MAX(EventTime)
FROM TEST_TIMES
WHERE EventTime <= @CheckTime
SELECT @HigherTime = MAX(EventTime)
FROM TEST_TIMES
WHERE EventTime >= @CheckTime
IF @LowerTime IS NULL RETURN @HigherTime
IF @HigherTime IS NULL RETURN @LowerTime
IF DATEDIFF(ms, @LowerTime, @CheckTime) < DATEDIFF(ms, @CheckTime, @HigherTime)
RETURN @LowerTime
RETURN @HigherTime
END
SELECT TimeValue, dbo.fn_ClosestTime(TimeValue) as ClosestTime
FROM fn_MyTimes('2012-05-17 12:00', '2012-05-17 13:00', 15)
Results:
TimeValue ClosestTime
----------------------- -----------------------
2012-05-17 12:00:00.000 2012-05-17 11:58:00.000
2012-05-17 12:15:00.000 2012-05-17 12:09:00.000
2012-05-17 12:30:00.000 2012-05-17 12:27:00.000
2012-05-17 12:45:00.000 2012-05-17 12:43:00.000
2012-05-17 13:00:00.000 2012-05-17 12:55:00.000
source
share