У меня есть таблица с именем Jobs, в которой отслеживаются задания и время их следующего запуска. Один конкретный вариант планирования позволяет заданию запускаться несколько раз в неделю. Я использую побитовые сравнения, чтобы определить, какой день наступит позже (ну ... я все равно пытаюсь.) Так, например. У меня есть таблица, как это ..
JobID NextRunTime DaysOfWeek
1 12-26-2011 21
Мое побитовое перечисление похоже на это ..
Monday = 1
Tuesday = 2
Wednesday = 4
Thursday = 8
Friday = 16
Saturday = 32
Sunday = 64.
Итак, мы знаем, что эта работа должна выполняться в понедельник, среду, пятницу. (12-26-2011) - понедельник, поэтому, когда он обновляется, он должен запускаться снова 12-28-2011, но я не могу придумать алгоритм, который позволяет мне программно устанавливать новый NextRunTime.
Это метод, который я сейчас пытаюсь заставить работать с каким-то псевдокодом, с чем у меня проблемы ..
IF OBJECT_ID('tempdb..#DaysSchedule') IS NOT NULL DROP TABLE #DaysSchedule
CREATE TABLE #DaysSchedule
(
Monday int, Tuesday Int, Wednesday Int, Thursday INT, Friday INT, Saturday INT, Sunday INT
)
INSERT INTO #DaysSchedule (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
Values(21 & 1,21 & 2,21 & 4,21 & 8,21 & 16 ,21 & 32,21 & 64)
Это дает нам таблицу, которая выглядит следующим образом:
Monday Tuesday Wednesday Thursday Friday Saturday Sunday
1 0 4 0 16 0 0
Отсюда (наполовину) псевдокод легко.
for (int i=1; i<7, i++)
{
thisDay = DATENAME(dw, DATEADD(day, i, nextRunTime)) -- we add one day
if (column named thisDay contains a value > 0) -- if that days value > 0
begin
We add the difference of thisDay to NextRunTime to NextRunTime and we're done.
end
}