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

时间:2011-12-21 14:57:48

标签: sql datetime bit-manipulation

我有一个名为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 个答案:

答案 0 :(得分:1)

使用三行来模拟这三天是否会如此糟糕?例如

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向下舍入到星期日然后添加偏移量等。

答案 1 :(得分:1)

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


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

目前......
- 从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