当 Freq_Type 为每周且在计划中选择超过一天时,MSDB.dbo.SysSchedules 中的 Freq_Interval 列的值是多少?

J.D*_*.D. 5 sql-server sql-server-2008-r2 jobs system-tables

我正在阅读Microsoft API 中的SysSchedules表,并尝试在查询中使用该表进行合并。

在文档中,Freq_Interval 列似乎是针对在计划中选择一天而 Freq_Type 为每周的情况定义的。但是选择多天的每天组合的值是什么?

例如,我有一项工作,计划每周在星期一、星期二、星期三、星期四和星期五发生。我在 MSDB.dbo.SysSchedules 表中看到,它的 Freq_Interval 为 62(文档中未列出)。

作业计划详情 MSDB.dbo.SysSchedules

Mar*_*ith 6

文档指出

freq_interval 是以下一项或多项:

1 = 星期日
2 = 星期一
4 = 星期二
8 = 星期三
16 = 星期四
32 = 星期五
64 = 星期六

这些值都是 2 的幂。

当您选择多天时,只需添加不同的代码即可。

2 + 4 + 8 + 16 + 32 = 62
Run Code Online (Sandbox Code Playgroud)

或者使用按位或运算符将它们组合起来。

2 | 4 | 8 | 16 | 32
Run Code Online (Sandbox Code Playgroud)

|(我的建议是在代码中使用,+如果在你的头脑中将它们相加! -|是“正确”的使用方式,如果列表中有重复的值,则不会出现错误的行为)

如果你想进行相反的操作,你需要按位和

DECLARE @Sunday TINYINT = 1,
        @Monday TINYINT = 2,
        @Tuesday TINYINT = 4,
        @Wednesday TINYINT = 8,
        @Thursday TINYINT = 16,
        @Friday TINYINT = 32,
        @Saturday TINYINT = 64;

DECLARE @TestValue TINYINT = 62;

SELECT CASE WHEN @TestValue & @Sunday = @Sunday THEN 'Y' ELSE 'N' END AS Sunday,
       CASE WHEN @TestValue & @Monday = @Monday THEN 'Y' ELSE 'N' END AS Monday,
       CASE WHEN @TestValue & @Tuesday = @Tuesday THEN 'Y' ELSE 'N' END AS Tuesday,
       CASE WHEN @TestValue & @Wednesday = @Wednesday THEN 'Y' ELSE 'N' END AS Wednesday,
       CASE WHEN @TestValue & @Thursday = @Thursday THEN 'Y' ELSE 'N' END AS Thursday,
       CASE WHEN @TestValue & @Friday = @Friday THEN 'Y' ELSE 'N' END AS Friday,
       CASE WHEN @TestValue & @Saturday = @Saturday THEN 'Y' ELSE 'N' END AS Saturday
Run Code Online (Sandbox Code Playgroud)