Sql-Server

您如何獲得平均工作歷史時間?

  • August 10, 2021

以下是我在網上找到的一個腳本,其中包含我在結果集中想要的大部分元素。唯一缺少的是如何獲得一個確定時間段內的平均執行時間,比如一周、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;

引用自:https://dba.stackexchange.com/questions/89280