DECLARE
@StartDate AS datetime, -- day that the reminder period starts
@LastReminderDate AS datetime, -- the last time the reminder triggered
@DayOfMonth AS integer, -- the day of the month to remind the user
@Interval AS integer -- how often in months to remind the user
SET @StartDate = '6/1/2011'
SET @LastReminderDate = '6/5/2011'
SET @DayOfMonth = 5 -- remind on the 5th of the month
SET @Interval = 2 -- remind every other month
SELECT
CASE
WHEN @LastReminderDate IS NULL
THEN
CASE WHEN Day(@StartDate) <= @DayOfMonth
THEN DateAdd( month, ((Year( @StartDate ) - 1900) * 12) + Month( @StartDate ) - 1, @DayOfMonth - 1 )
ELSE DateAdd( month, ((Year( @StartDate ) - 1900) * 12) + Month( @StartDate ) - 0, @DayOfMonth - 1 )
END
ELSE DateAdd( month, @Interval, @LastReminderDate )
END
Мясо этого - последние четыре строки, оператор SELECT CASE ... END
.Я предоставил целый сценарий, который позволяет вам подключать различные значения и видеть, как SELECT CASE ... END
ведет себя для этих тестовых значений.
Но чтобы просто использовать это в своей таблице, используйте только последние четыре строки (и удалите@
в начале имен, чтобы они соответствовали именам столбцов таблицы).
Вы также можете обобщить это так, чтобы интервал не составлял месяцы.Если в вашей таблице есть столбец IntervalType, вы можете указать это в качестве первого аргумента для DateAdd()
.См. Документы, но некоторые общие интервалы: days
, months
, years
и т. Д.
EDIT2: Respect DayOfMonth.