给定一组数值,计算给出结果的组合

Given a set of numeric values, calculate the combination that gives the result

我有一个 SQL 服务器查询,每周向我显示 运行 的所有代理作业。我想知道他们 运行 在哪几天。

我有以下查询

SELECT  j.name,
        CASE
            WHEN s.freq_type = 4 OR (s.freq_type = 8 AND freq_interval = 2) -- a job with a daily recurrance or weekly on this day
            THEN 1
        END AS Monday,
        CASE
            WHEN s.freq_type = 4 OR (s.freq_type = 8 AND freq_interval = 3) 
            THEN 1
        END AS Tuesday,
        CASE
            WHEN s.freq_type = 4 OR (s.freq_type = 8 AND freq_interval = 4) 
            THEN 1
        END AS Wednesday,
        CASE
            WHEN s.freq_type = 4 OR (s.freq_type = 8 AND freq_interval = 5) 
            THEN 1
        END AS Thursday,
        CASE
            WHEN s.freq_type = 4 OR (s.freq_type = 8 AND freq_interval = 6) 
            THEN 1
        END AS Friday,
        CASE
            WHEN s.freq_type = 4 OR (s.freq_type = 8 AND freq_interval = 7) 
            THEN 1
        END AS Saturday,
        CASE
            WHEN s.freq_type = 4 OR (s.freq_type = 8 AND freq_interval = 1) 
            THEN 1
        END AS Sunday,
        s.freq_interval
FROM    msdb.dbo.sysjobschedules js
        JOIN msdb.dbo.sysschedules s
            ON js.schedule_id = s.schedule_id
        JOIN msdb.dbo.sysjobs j
            ON js.job_id = j.job_id
WHERE   j.enabled = 1 AND
        s.enabled = 1 AND
        s.freq_type = 8

s.freq_interval列是数值组合的总和如下

1 = Sunday
2 = Monday
4 = Tuesday
8 = Wednesday
16 = Thursday
32 = Friday
64 = Saturday

因此,如果作业安排在星期二和星期四 运行,s.freq_interval 将为 4+16=20 如果作业安排在周五、周六和周日 运行,则 s.freq_interval 将是 32+64+1=97

如何获取 s.freq_interval 中的值并计算总和为该数字的值的组合?

您可以使用 & 按位运算符来执行此操作:

SELECT *
FROM (VALUES(1 ,'Sunday'),
            (2 ,'Monday'),
            (4 ,'Tuesday'),
            (8 ,'Wednesday'),
            (16,'Thursday'),
            (32,'Friday'),
            (64,'Saturday'))V(FrequencyInt, FrequnecyDay)
     JOIN (VALUES(20),(97),(13),(8)) J(Freq) ON V.Frequencyint & J.Freq != 0;