以下は、私がオンラインで見つけたスクリプトで、結果セットに必要な要素のほとんどが含まれています。唯一足りないのは、1週間、10日、23日、1か月など、決められた期間の実行時間の平均を取得する方法です。
いくつかの検索を実行しましたが、試行した結果が何らかの形で失敗しました。さらに、私のTSQLは弱いですが、この問題を変更するためにItzik Ben-ganの出版物を読んでいます。どなたでもご協力いただけると助かります。
select job_name, run_datetime, run_duration
from
(
select job_name, run_datetime,
SUBSTRING(run_duration, 1, 2) + ':' + SUBSTRING(run_duration, 3, 2) + ':' +
SUBSTRING(run_duration, 5, 2) AS run_duration
from
(
select DISTINCT
j.name as job_name,
run_datetime = CONVERT(DATETIME, RTRIM(run_date)) +
(run_time * 9 + run_time % 10000 * 6 + run_time % 100 * 10) / 216e4,
run_duration = RIGHT('000000' + CONVERT(varchar(6), run_duration), 6)
from msdb..sysjobhistory h
inner join msdb..sysjobs j
on h.job_id = j.job_id
) t
) t
order by job_name, run_datetime
新しい要件を満たすために更新されました。 CONVERT(TIME
を使いたくなるかもしれませんが、抵抗する-24時間を超えるジョブが実行される場合、これは脆弱です。
SELECT
job_name = name,
avg_sec = rd,
avg_hhmm = CONVERT(VARCHAR(11),rd / 60) + ':' + RIGHT('0' + CONVERT(VARCHAR(11),rd % 60), 2)
FROM
(
SELECT
j.name,
rd = AVG(DATEDIFF(SECOND, 0, STUFF(STUFF(RIGHT('000000'
+ CONVERT(VARCHAR(6),run_duration),6),5,0,':'),3,0,':')))
FROM msdb.dbo.sysjobhistory AS h
INNER JOIN msdb.dbo.sysjobs AS j
ON h.job_id = j.job_id
WHERE h.step_id = 0
GROUP BY j.name
) AS t
ORDER BY job_name;