sysjobhistory
に問い合わせたことがある場合 msdb
のテーブル データベースの場合、日時列と期間列が整数として格納されていることをおそらくご存知でしょう。
特に、このテーブルをクエリすると、run_date
、run_time
、およびduration
列は整数として返されるため、読みにくくなる可能性があります。
以下は、このデータを読みやすい形式で返すために使用できるクエリです。
問題
まず、これらの列がどのように返されるかを見てみましょう。
SELECT TOP 15
run_date,
run_time,
run_duration
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
結果:
run_date run_time run_duration 20201215 155451 625 20201215 155948 128 20201115 20001 17 20201115 20002 16 20201218 44026 13 20201217 20000 10 20201218 44029 10 20201216 21902 9 20201217 20001 9 20201219 23527 9 20201213 34249 8 20201216 21903 8 20201219 23528 8 20201213 34250 7 20201214 32114 7
各列の保存/表示方法は次のとおりです。
-
run_date
列はYYYYMMDD形式で保存されます。 -
run_time
列は24時間制でHHMMSS形式で保存されます。ただし、先行ゼロはありません。 -
run_duration
列はHHMMSS形式で保存されます。繰り返しますが、先行ゼロはありません。さらに、各セグメントを区別するのに役立つコロンはありません。したがって、上記の例では、最初のジョブは6分25秒で終了し、2番目のジョブは1分28秒で終了し、3番目のジョブは17秒で終了しました。
フォーマットがどのように機能するかを理解すれば、通常、それを理解するのはそれほど難しくありません。しかし、私たち人間が読むのは直感的ではない可能性があります。
ソリューション
データをより人間が読める形式で表示するソリューションは次のとおりです。
SELECT TOP 15
msdb.dbo.AGENT_DATETIME(run_date, run_time) AS RunDateTime,
STUFF(STUFF(STUFF(RIGHT(REPLICATE('0', 8) + CAST(run_duration as varchar(8)), 8), 3, 0, ':'), 6, 0, ':'), 9, 0, ':') AS RunDuration
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
結果:
RunDateTime RunDuration 2020-12-15 15:54:51.000 00:00:06:25 2020-12-15 15:59:48.000 00:00:01:28 2020-11-15 02:00:01.000 00:00:00:17 2020-11-15 02:00:02.000 00:00:00:16 2020-12-18 04:40:26.000 00:00:00:13 2020-12-17 02:00:00.000 00:00:00:10 2020-12-18 04:40:29.000 00:00:00:10 2020-12-16 02:19:02.000 00:00:00:09 2020-12-17 02:00:01.000 00:00:00:09 2020-12-19 02:35:27.000 00:00:00:09 2020-12-13 03:42:49.000 00:00:00:08 2020-12-16 02:19:03.000 00:00:00:08 2020-12-19 02:35:28.000 00:00:00:08 2020-12-13 03:42:50.000 00:00:00:07 2020-12-14 03:21:14.000 00:00:00:07
ここでは、文書化されていないAGENT_DATETIME()
を使用します run_date
を変換する関数 およびrun_time
列をより読みやすい形式に変換します。
次に、一連のT-SQL関数(STUFF()
、RIGHT()
、CAST()
、およびREPLICATE()
)run_duration
を取得するには 列をより人間が読める形式に変換します。これらにより、適切な場所にコロンが挿入され、各セグメントに常に2桁の数字(必要に応じて先行ゼロを含む)が存在するようになります。
その他のフォーマット
さらに一歩進んで、FORMAT()
などの他の関数を使用することもできます。 run_date
を表示する関数 およびrun_time
さらに読みやすい形式の列。
SELECT TOP 15
FORMAT(msdb.dbo.AGENT_DATETIME(run_date, run_time), 'U') AS RunDateTime
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
結果:
RunDateTime Tuesday, December 15, 2020 11:54:51 PM Tuesday, December 15, 2020 11:59:48 PM Sunday, November 15, 2020 10:00:01 AM Sunday, November 15, 2020 10:00:02 AM Friday, December 18, 2020 12:40:26 PM Thursday, December 17, 2020 10:00:00 AM Friday, December 18, 2020 12:40:29 PM Wednesday, December 16, 2020 10:19:02 AM Thursday, December 17, 2020 10:00:01 AM Saturday, December 19, 2020 10:35:27 AM Sunday, December 13, 2020 11:42:49 AM Wednesday, December 16, 2020 10:19:03 AM Saturday, December 19, 2020 10:35:28 AM Sunday, December 13, 2020 11:42:50 AM Monday, December 14, 2020 11:21:14 AM
この関数では、カルチャ引数だけでなく、他の任意の数のフォーマット指定子を使用できます。
詳細と例については、以下を参照してください。
- SQLServerで日付と時刻をフォーマットする方法
- 標準の日付と時刻の形式の文字列
- カスタムの日付と時刻の形式の文字列
ジョブ名の取得
sysjobhistory
テーブルにはジョブ名は保存されません。 IDのみを保存します。
日付/時刻/期間データとともにジョブ名を返すには、sysjobs_view
で結合を実行できます。 ビュー(またはsysjobs
表)ジョブ名を取得します。
これを行うクエリの例を次に示します。
SELECT jv.name AS Job,
jh.step_name AS Step,
msdb.dbo.AGENT_DATETIME(jh.run_date, jh.run_time) AS RunDateTime,
STUFF(STUFF(STUFF(RIGHT(REPLICATE('0', 8) + CAST(jh.run_duration as varchar(8)), 8), 3, 0, ':'), 6, 0, ':'), 9, 0, ':') AS RunDuration
FROM msdb.dbo.sysjobs_view jv
INNER JOIN msdb.dbo.sysjobhistory jh
ON jv.job_id = jh.job_id
ORDER BY Job, RunDateTime;
結果: