SQL Server 2005 Побитовый Какой день следующий? - PullRequest
4 голосов
/ 21 декабря 2011

У меня есть таблица с именем 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
 }

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

ПРИМЕЧАНИЕ: Я не собираюсь комментировать идею представления нескольких элементов данных в одном поле.Это может или не может быть уместно в этом случае, я просто комментирую, как заставить этот тип идеи работать.

Проблема, с которой вы сталкиваетесь, заключается в том, что информация фактически не соответствует ее использованию.

В настоящее время ...
- Извлеките ДЕНЬ из NextRunTime
- ОпределитеБИТ, представляющий этот день
- ПОИСК для следующего бита, установленного в единицу, с циклическим переходом к началу при необходимости
- Определить пройденное расстояние в этом поиске
- Добавить это расстояние к NextRunTime

Это просто не эффективно или просто.

Я бы рекомендовал вместо этого записать количество дней, которое нужно добавить, чтобы достичь следующей запланированной даты.

Примеры:

-----15 = Saturday and Sunday Only  
1111111 = Every Day  
11113-- = Every Weekday  
2-2-3-- = Monday, Wednesday, Friday  

Это изменяет алгоритм на ...
- Извлечь ДЕНЬ из NextRunTime
- Определить символ в этой позиции
- Привести его к INT
- Добавить столько дней в NextRunTime

Это исключает раздел поиска и подсчета, заменив его прямым взглядом.

Он допускает «тупики» или более сложные планы.Это может быть преимуществом или недостатком в зависимости от вашей ситуации ...

1111100 = Every weekday for a week, then stop
2222222 = Every other day, on a two week cycle
1 голос
/ 21 декабря 2011

Было бы так плохо использовать три ряда для моделирования трех дней? например

INSERT INTO Jobs (JobID, NextRunTime, RepeatOption)
   VALUES (1, '2011-12-26', 'Y');


INSERT INTO RepeatJobs (JobID, RepeatOption, DaysOffset)
   VALUES (1, 'Y', 2), 
          (1, 'Y', 4);

Если вы хотите использовать побитовую обработку, как насчет создания таблицы поиска, например

VALUES (1, 'Monday'), 
       (2, 'Tuesday'), 
       (3, 'Monday'), 
       (3, 'Tuesday'), 
       (4, 'Wednesday'), 
       (5, 'Monday'), 
       (5, 'Wednesday'), 
       (6, 'Tuesday'), 
       (6, 'Wednesday'),        
       (7, 'Monday'), 
       (7, 'Tuesday'), 
       (7, 'Wednesday'), 
       (8, 'Thursday'), 
       (9, 'Monday'), 
       (9, 'Thursday'), 
       (10, 'Tuesday'), 
       (10, 'Thursday'), 
       (11, ...

... но вместо «понедельник», «вторник», «среда» и т. Д. Хранится смещение в днях от установленного дня недели, скажем, воскресенья, затем округляется до NextRunTime до воскресенья, затем добавляется смещение и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...