我在SQL中更新鲜,我想写一个查询来从msdb.dbo.sysjobhistory获取最后24小时的工作记录,但我不能得到因为,这里我得到run_date和run_time就像number.how我会将run_date和run_time转换为datetime并获取最后24小时的作业记录。
我正在使用SQL Server 2000
提前致谢
答案 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())
我相信其中一部分来自博客,但我们找不到它,我也将其链接...