web-dev-qa-db-ja.com

どのようにして平均職歴時間を取得しますか?

以下は、私がオンラインで見つけたスクリプトで、結果セットに必要な要素のほとんどが含まれています。唯一足りないのは、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
6
Sean Perkins

新しい要件を満たすために更新されました。 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;
7
Aaron Bertrand