Sql-Server
您如何獲得平均工作歷史時間?
以下是我在網上找到的一個腳本,其中包含我在結果集中想要的大部分元素。唯一缺少的是如何獲得一個確定時間段內的平均執行時間,比如一周、10 天、23 天、一個月等。
我已經進行了一些搜尋,但是我嘗試過的方法以某種方式失敗了。此外,我的 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_mmss = 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;