У меня есть таблица, которая выглядит примерно так (упрощенно):
*ScheduledReports*
ReportID
StartDate
Frequency
Interval (1=months, 2=days)
Так что, если бы я хотел запускать отчет каждые 3 дня, частота была бы равна 3, а интервал был бы равен 2.
Я пытаюсь написать хранимую процедуру, которую мы можем запускать один раз в день, которая будет запускать все отчеты из таблицы, запланированные на сегодня (или должна была выполняться с момента последнего запуска хранимой процедуры).,
Хранимая процедура также имеет доступ к lastRunTime (последний раз, когда эта хранимая процедура запускалась).
Вот как выглядит мой запрос:
-- get monthly reports that should be run
SELECT reportID
FROM ScheduledReports
WHERE intervalType = 1 AND
dateadd(m, (
frequency * ceiling((
--sql server calculates datediff of months based on the actual int of the month
--not if it's a true month later, so the following is necessary to check for
--a dayOfMonth difference
CASE
WHEN startDate > @lastRunTime
THEN 0
WHEN day(startDate) > day(@lastRunTime)
THEN datediff(m, startDate, @lastRunTime) - 1
ELSE datediff(m, startDate, @lastRunTime)
END
) / (frequency*1.0))
), startDate) BETWEEN @lastRunTime AND getDate()
UNION ALL
-- get weekly reports that should be run
SELECT reportID
FROM ScheduledReports
WHERE intervalType = 2 AND
dateadd(d, (
frequency * ceiling((
CASE
WHEN startDate > @lastRunTime
THEN 0
ELSE datediff(d, startDate, @lastRunTime)
END
) / (frequency*1.0)
)), startDate) BETWEEN @lastRunTime AND getDate()
Хотя с логикой что-то не так.Что не так с моей логикой?Как мне это сделать?