从msdb.dbo.sysjobhistory获取最后24小时的工作记录

时间:2010-10-09 06:41:42

标签: sql sql-server sql-server-2000

我在SQL中更新鲜,我想写一个查询来从msdb.dbo.sysjobhistory获取最后24小时的工作记录,但我不能得到因为,这里我得到run_date和run_time就像number.how我会将run_date和run_time转换为datetime并获取最后24小时的作业记录。

我正在使用SQL Server 2000

提前致谢

3 个答案:

答案 0 :(得分:10)

结帐this post - 它会显示如何从run_date“解码”这些sysjobhistory列。

您应该可以使用以下查询获取过去24小时内的条目:

SELECT 
    j.name as JobName, 
    LastRunDateTime = 
    CONVERT(DATETIME, CONVERT(CHAR(8), run_date, 112) + ' ' 
    + STUFF(STUFF(RIGHT('000000' + CONVERT(VARCHAR(8), run_time), 6), 5, 0, ':'), 3, 0, ':'), 121)
FROM 
    msdb..sysjobs j
INNER JOIN
    msdb..sysjobhistory jh ON j.job_id = jh.job_id
WHERE
    CONVERT(DATETIME, CONVERT(CHAR(8), run_date, 112) + ' ' 
    + STUFF(STUFF(RIGHT('000000' + CONVERT(VARCHAR(8), run_time), 6), 5, 0, ':'), 3, 0, ':'), 121) > DATEADD(HOUR, -24, GETDATE())

答案 1 :(得分:3)

对于2000之后的数据库,msdb数据库中有一个函数可以调用,它将返回datetime:

msdb.dbo.agent_datetime(run_date, run_time) as 'RunDateTime'

如果您使用的是sql 2000,则可以从更高版本复制该函数的源代码,并在2000的实例中创建它。我希望我能为所有这些做出贡献,但我最初在此处找到它:{ {3}}

答案 2 :(得分:0)

我的一位同事指出,其他给定的解决方案只能找到我们在24小时前(或更少)开始开始的工作,而不是完成的工作> 24小时之前(或更少)。他针对以下完成工作提出了一些建议:

SELECT j.name AS JobName
    ,LastCompletedDateTime = DATEADD(day, (run_duration / 240000), CONVERT(DATETIME, msdb.dbo.agent_datetime(run_date, run_time))) + 
        STUFF(STUFF(REPLACE(STR((run_duration % 240000), 7, 0), ' ', '0'), 4, 0, ':'), 7, 0, ':')
FROM msdb..sysjobs j
INNER JOIN msdb..sysjobhistory jh ON j.job_id = jh.job_id
WHERE DATEADD(day, (run_duration / 240000), CONVERT(DATETIME, msdb.dbo.agent_datetime(run_date, run_time))) + 
    STUFF(STUFF(REPLACE(STR((run_duration % 240000), 7, 0), ' ', '0'), 4, 0, ':'), 7, 0, ':') > DATEADD(HOUR, - 24, GETDATE())

我相信其中一部分来自博客,但我们找不到它,我也将其链接...