1

很难将我的问题放在标题中。我正在寻找的是一种查看过去 15 分钟内计划运行哪些任务的方法。

我目前有一个表格,显示任务应该运行的窗口以及它应该在该窗口内启动的频率。但是,我对这种类型的查询没有经验。希望有人可以帮忙。我还应该说我想这样做而不创建额外的表

日程表

| taskID | startTime | endTime | everyMinutes |
|________|___________|_________|______________|
| 135467 |    8:00   |  20:00  |      15      |
| 675314 |    7:15   |  13:45  |      30      |

例如,在上表中,如果时间是 9:18,则查询将返回两个任务

| taskID | scheduledTime|
|________|______________|
| 135467 |     9:15     |
| 675314 |     9:15     |

好像它是在 9:35 运行的,查询只会返回 1 个结果

| taskID | scheduledTime|
|________|______________|
| 135467 |     9:30     |
4

2 回答 2

2

您可以使用数字表Schedule表扩展为一系列taskID, scheduledTime行,然后过滤行以仅返回scheduledTime过去 15 分钟内的行:

WITH expanded AS (
  SELECT
    s.taskID,
    scheduledTime = DATEADD(MINUTE, s.everyMinutes * n.N, s.startTime)
  FROM Schedule s
  INNER JOIN Numbers n
  ON n.N BETWEEN 0 AND DATEDIFF(MINUTE, s.startTime, s.endTime) / s.everyMinutes
)
SELECT e.*
FROM expanded e
CROSS APPLY (SELECT CAST(GETDATE() AS time)) x (now)
WHERE e.scheduledTime BETWEEN DATEADD(MINUTE, -15, x.now) AND x.now
;

您可以在 SQL Fiddle尝试这个查询,也可以使用它。

于 2012-08-28T22:51:06.810 回答
-1

第 1 点:您应该使用cron 作业来安排您的任务,并使用数据库表来保存实际运行的作业的历史记录(开始时间、结束时间、结果等)。这样您可以获得更准确的报告。所有作业都有例外(例如,有些作业不在周末运行,有些不在公共假期运行),因此使用时间表推断运行的作业可能会导致您做出错误的假设。

第 2 点:我不建议在数据库中执行此操作。与在数据库中相比,在 C# 或 PHP 中编码更容易,运行速度更快

于 2012-08-28T16:54:17.590 回答