SQL Server 2005 Bitwise下一天是哪一天?

我有一个名为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
 }

最佳答案 注意:我不打算评论在单个字段中表示多个数据项的想法.在这种情况下,它可能适用也可能不适合,我只是在评论如何使这种类型的想法发挥作用.

您面临的问题是信息实际上与其使用不匹配.

现在…
– 从NextRunTime中提取DAY
– 确定代表当天的BIT
– 搜索下一位设置为1,必要时循环到开始
– 确定搜索中的行进距离
– 将该距离添加到NextRunTime

这不是有效或简单的.

我建议改为记录要添加的天数以达到下一个计划日期.

例子:

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

这会将算法更改为…
– 从NextRunTime中提取DAY
– 识别该位置的角色
– 将其投射到INT
– 将这么多天添加到NextRunTime

这避免了搜索和计数部分,将其替换为直接查找.

它确实允许“死胡同”或更复杂的计划.根据您的情况,这可能是一个优势或不利因素……

1111100 = Every weekday for a week, then stop
2222222 = Every other day, on a two week cycle
点赞