- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试开发一个定期事件日历。看起来 msdb
数据库中的 sysschedules
表可以很好地完成这项工作。
但是我面临着一些挑战,希望有人能提供帮助。
a) active_start_date
:这是事件第一次发生的日期吗?或者事件开始前的任何日期?
b) 如何找到特定日期的匹配事件(一次、每日、每周、每月等)?
编辑:我没有直接使用sysschedules
表。而是创建一个具有相同列的新表。
最佳答案
首先,您应该引用 sysschedules 。但据我了解,有一个错字。这个
active_start_time Time on any day between active_start_date and active_end_date that job begins executing. Time is formatted HHMMSS, using a 24-hour clock.
应理解为
active_start_time Time on any day between active_start_time and active_end_time that job begins executing. Time is formatted HHMMSS, using a 24-hour clock.
考虑一下:
active_start_date Date on which execution of a job can begin. The date is formatted as YYYYMMDD. NULL indicates today's date.
这意味着,如果您将定期作业配置为每天每小时启动一次,并设置 active_start_time = 100000 和 active_start_date = 20120323,则作业直到 2012 年 3 月 23 日才会运行 10是。
但是,如果您要创建一次性运行的任务,则此字段包含确切的开始日期和时间。
对于寻找匹配事件,我的看法如下。当您更新某些重要内容(例如计划类型或开始时间)或循环计划引发下一个作业执行时,SQL 代理会计算计划的下一次运行时间并将其存储在 sysjobschedules.next_run_date
中。
因此,它总是有一个下次执行的列表,并且不能解决“查找特定日期的匹配事件”的问题。我认为你应该以同样的方式实现你的系统。
但是如果您坚持以这种方式进行操作,我们可以考虑使用 T-SQL 查询。
更新
下面的脚本可以帮助您完成任务。目前它适用于两种类型的时间表:
1.启动一次
2.每天开始,每N天一次,当天一次
据我从你的评论中了解到,你会使用它们。您可以在需要时立即以相同的方式添加其他类型(UNION ALL ... UNION ALL ...
)。
函数 msdb_time_convert
将 HHMMSS 整数转换为 TIME 数据类型。
CREATE FUNCTION msdb_time_convert (
@int_time INT
)
RETURNS TIME(0)
AS
BEGIN
IF NOT (@int_time BETWEEN 0 AND 235959)
RETURN NULL
DECLARE @str VARCHAR(32) = CAST(@int_time AS VARCHAR(32))
SELECT @str = REPLICATE('0', 6 - LEN(@str)) + @str
SELECT @str = STUFF(@str, 3, 0, ':')
SELECT @str = STUFF(@str, 6, 0, ':')
RETURN CONVERT(TIME(0), @str, 108)
END
GO
您可以在 @find_date
变量中指定任何日期时间,以查找不同时间点的下一次运行。
DECLARE @find_date DATETIME = GETDATE()
;WITH CTE AS (
SELECT
CONVERT(DATE, CAST(active_start_date AS VARCHAR(32)), 112) AS active_start_date,
CONVERT(DATE, CAST(active_end_date AS VARCHAR(32)), 112) AS active_end_date,
dbo.msdb_time_convert(active_start_time) AS active_start_time,
dbo.msdb_time_convert(active_end_time) AS active_end_time,
schedule_id,
schedule_uid,
name,
enabled,
freq_type,
freq_interval,
freq_subday_type,
freq_subday_interval,
freq_relative_interval,
freq_recurrence_factor,
CAST(@find_date AS DATE) AS today_date,
CAST(@find_date AS TIME(0)) AS today_time,
DATEADD(day, DATEDIFF(day, CONVERT(DATETIME, CAST(active_start_date AS VARCHAR(32)), 112) - 1, @find_date) % NULLIF(freq_interval, 0), CAST(@find_date AS DATE)) AS next_daily_day
FROM dbo.sysschedules
)
SELECT
schedule_id,
name,
CAST(active_start_date AS DATETIME) + active_start_time AS next_run_datetime
FROM CTE
WHERE
enabled = 1
AND freq_type = 1 -- 1 = One time only
AND CAST(active_start_date AS DATETIME) + active_start_time >= @find_date
UNION ALL
SELECT
schedule_id,
name,
DATEADD(
DAY,
CASE WHEN CAST(next_daily_day AS DATETIME) + active_start_time > @find_date THEN 0 ELSE freq_interval END,
CAST(next_daily_day AS DATETIME) + active_start_time
) AS next_run_datetime
FROM CTE
WHERE
enabled = 1
AND freq_type = 4 -- 4 = Daily (Every freq_interval days)
AND freq_subday_type = 1 -- 1 = At the specified time
AND CAST(active_end_date AS DATETIME) + active_end_time >= @find_date
关于sql - 使用 sysschedules 类似事件表 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9813476/
此表:sysschedules 如果 freq_type 为 8(每周),则 Su、M、T、W 的 freq_interval 为 1,2,4,8,16,32,64, Th、F、S。 但是,当 fre
鉴于此模型:sysschedules ,并假设数据库中有几个事件具有不同的重复模式组合:每天、每天每 3 天、每周星期二。每 2 周一次,每月 28 日,每月每 2 个月的第二个星期二,每年的 2 月
我正在尝试开发一个定期事件日历。看起来 msdb 数据库中的 sysschedules 表可以很好地完成这项工作。 但是我面临着一些挑战,希望有人能提供帮助。 a) active_start_date
我是一名优秀的程序员,十分优秀!