sql >> データベース >  >> RDS >> Sqlserver

SQLServerでsysjobhistoryの日時と期間の列をフォーマットします

    sysjobhistoryに問い合わせたことがある場合 msdbのテーブル データベースの場合、日時列と期間列が整数として格納されていることをおそらくご存知でしょう。

    特に、このテーブルをクエリすると、run_daterun_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;

    結果:


    1. PDO例外を処理する方法

    2. RUまたはRUR?

    3. OracleFormsでPLAY_SOUNDする方法

    4. SQL Server 2016:ログインを作成する