您如何获得平均工作历史时间?

Sea*_*ins 7 sql-server t-sql jobs

以下是我在网上找到的一个脚本,其中包含我想要的结果集中的大部分元素。唯一缺少的是我如何获得确定时间段内运行时间的平均值,例如一周、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
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 8

更新以满足新的要求。请注意,您可能很想使用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;
Run Code Online (Sandbox Code Playgroud)