SQL:生成具有不同频率的调度表

时间:2017-07-31 21:13:11

标签: sql-server

我在SQL Server 2012中工作。我有3个表。第一个是“时间表”表。它的结构如下:

CREATE TABLE schedule
(
    JobID int
    ,BeginDate date
    ,EndDate date
)

一些示例数据是:

INSERT INTO schedule
SELECT 1, '2017-01-01', '2017-07-31' UNION ALL
SELECT 2, '2017-02-01', '2017-06-30'

第二个是“频率”表。它的结构如下:

CREATE TABLE frequency
(
    JobID int
    ,RunDay varchar(9)
)

一些示例数据是:

INSERT INTO frequency
SELECT 1, 'Sunday' UNION ALL
SELECT 1, 'Monday' UNION ALL
SELECT 1, 'Tuesday' UNION ALL
SELECT 1, 'Wednesday' UNION ALL
SELECT 1, 'Thursday' UNION ALL
SELECT 1, 'Friday' UNION ALL
SELECT 1, 'Saturday' UNION ALL
SELECT 2, 'Wednesday'

第三个是“日历”表。它的结构如下:

CREATE TABLE calendar
(
    CalendarFullDate date
    ,DayName varchar(9)
)

我的目标是“取消忽略”计划表,以便为每个JobID为BeginDate和EndDate中的日期范围创建一个行。行必须与每个JobID的频率表中的天数匹配。

到目前为止,每个工作的日期频率是每天或每周。为此,我使用以下SQL生成我想要的表:

SELECT
    s.JobID
    ,c.CalendarFullDate
FROM
    schedule AS s
INNER JOIN
    calendar AS c
ON
    c.CalendarFullDate BETWEEN s.BeginDate AND s.EndDate
INNER JOIN
    frequency AS f
ON
    f.JobID = s.JobID
    AND f.RunDay = c.DayName

这对于高于每周(例如,每两周一次)的频率不起作用。为此,我知道我的频率表需要改变结构。特别是,我必须添加一个给出频率的列(例如,每日,每周,每两周一次)。而且,我打赌我还需要在日历表中添加一个周数字列。

如何生成我想要的表格,以适应至少每两周一次的频率(如果不是更高的频率)?例如,如果JobID = 3是一个在周三运行的双周工作,并且它受BeginDate ='2017-06-01'和EndDate ='2017-07-31'的约束,那么,对于这个工作,我会期望结果如下:

JobID    Date
3        2017-06-07
3        2017-06-21
3        2017-07-05
3        2017-07-19

1 个答案:

答案 0 :(得分:0)

我更改了时间表表而不是频率表。我添加了一个SkipWeeks字段,该字段应每两周设置为1,将其设置为每三周运行一次,等等。我使用了一个表值函数来返回正确的日期。我想这就是您想要的。

$ casperjs example.js purchase automatic --username="johndoe" --password="qwerty123"

casper.echo(casper.cli.get(0)); // purchase
casper.echo(casper.cli.get(1)); // automatic
casper.echo(casper.cli.get('username')); // johndoe
casper.echo(casper.cli.get('password')); // qwerty123