基于SQL的计划

时间:2014-12-01 19:09:26

标签: sql-server tsql scheduled-tasks

我有3张桌子。

1)任务,范围和优先级。

CREATE TABLE taskPriorities (
[taskCommand] [varchar](max) NOT NULL,
[taskStartDate] [int] NOT NULL,
[taskEndDate] [int] NOT NULL,
[taskPriority] [int] NOT NULL) 

2)执行任务日志

CREATE TABLE taskLog (
[id] [int] IDENTITY(1,1) NOT NULL,
[jobId] [int] NOT NULL,
[emailAddress] [varchar](255) NOT NULL,
[taskCommand] [varchar](max) NOT NULL,
[executionDate] [datetime] NOT NULL)

3)任务通知列表

CREATE TABLE taskSubscribers (
[emailAddress] [varchar](255) NOT NULL,
[finalDate] [datetime] NOT NULL,
[initialDate] [datetime] NOT NULL)

这是棘手的部分:

我需要根据今天和最后一天之间的差异来计算每天应该运行哪些任务。每天只应执行1个任务(如果计算的差异在两个(或更多)任务的中间进行,则应该运行具有最高优先级的任务,然后如果有多个任务,则剩余的任务应该是一个使用较大的taskStartDate)并且不应选择已执行的任务。但是,如果initialDate发生在这些任务的时间线之后应该 crunched ,以便为每个任务订阅者运行大多数任务。 (解释正当英语不是我的母语很复杂。)

这有点混乱(至少对我来说),应该用SQL解决(T-SQL没关系)。我可以设法运行几个连续的查询...

到目前为止,我只使用此查询取得了部分成功:

   Select audience.jobId,
      audience.emailAddress, 
      audience.taskCommand, 
      audience.execDate, 
      audience.remainingDays, 
      audience.taskStartDate, 
      audience.taskEndDate, 
      audience.taskPriority
 From (Select 1 As jobId, /*Hardcoded*/
              remainings.emailAddress, 
              tp.taskCommand, 
              GetDate() As execDate, 
              remainings.remainingDays, 
              tp.taskStartDate, 
              tp.taskEndDate, 
              tp.taskPriority
         From taskPriorities tp 
              Inner Join (Select subs.emailAddress, 
                                 DATEDIFF(DAY, GetDate(), subs.finalDate) As remainingDays 
                            From taskSubscribers subs) remainings On remainings.remainingDays Between tp.taskEndDate And tp.taskStartDate) audience
      Left Join taskLog tl On tl.taskCommand = audience.taskCommand And tl.emailAddress = audience.emailAddress
Where tl.id Is Null
     And audience.taskCommand = (  Select Top 1 tpr.taskCommand
                                     From taskPriorities tpr
                                    Where audience.remainingDays Between tpr.taskEndDate And tpr.taskStartDate
                                 Order By tpr.taskPriority desc , tpr.taskStartDate, tpr.taskEndDate)

(所有这些都在http://sqlfiddle.com/#!3/67dd7/1/0

一些例子:

          |----------|---------|
          -20        -10       0
Task 1 P1   |-----------|

Task 2 P2        |-----------|

订阅者1,第17天的初始日期< = -20应该运行任务1.在第15天应该运行任务2(任务1已经执行)。

订阅者2,初始日期为-15,应该运行任务1,因为它是较旧的任务,并且在第14天应该运行任务2.

任何人都可以在 crunching 部分给我一些线索吗?

由于

0 个答案:

没有答案