Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Formatieren Sie sysjobhistory datetime &duration Spalten in SQL Server

Wenn Sie jemals die sysjobhistory abgefragt haben Tabelle in der msdb Datenbank wissen Sie wahrscheinlich, dass die Spalten datetime und duration als ganze Zahlen gespeichert werden.

Insbesondere wenn Sie diese Tabelle abfragen, wird das run_date , run_time , und duration Spalten werden als Ganzzahlen zurückgegeben, was das Lesen erschweren kann.

Nachfolgend finden Sie eine Abfrage, mit der Sie diese Daten in einem leichter lesbaren Format zurückgeben können.

Das Problem

Sehen wir uns zunächst an, wie diese Spalten zurückgegeben werden:

SELECT TOP 15
	run_date,
	run_time,
	run_duration
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;

Ergebnis:

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

So wird jede Spalte gespeichert/dargestellt:

  • Das run_date Spalte wird im Format YYYYMMDD gespeichert.
  • Die run_time Spalte wird im HHMMSS-Format auf einer 24-Stunden-Uhr gespeichert. Aber es gibt keine führenden Nullen.
  • Die run_duration Spalte wird im HHMMSS-Format gespeichert. Auch hier gibt es keine führenden Nullen. Außerdem gibt es keine Doppelpunkte, die uns helfen, zwischen den einzelnen Segmenten zu unterscheiden. Im obigen Beispiel wurde der erste Job in 6 Minuten und 25 Sekunden beendet, der zweite Job in 1 Minute und 28 Sekunden und der dritte Job in 17 Sekunden.

Sobald Sie wissen, wie die Formatierung funktioniert, ist es normalerweise nicht allzu schwierig, sie herauszufinden. Aber es kann für uns Menschen unintuitiv zu lesen sein.

Die Lösung

Hier ist eine Lösung, die die Daten in einem besser lesbaren Format darstellt:

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;

Ergebnis:

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

Hier verwende ich das undokumentierte AGENT_DATETIME() Funktion zum Konvertieren des run_date und run_time Spalten in ein besser lesbares Format.

Ich verwende dann eine Reihe von T-SQL-Funktionen (STUFF() , RIGHT() , CAST() , und REPLICATE() ), um die run_duration zu erhalten Spalte in ein besser lesbares Format umwandeln. Diese sorgen dafür, dass an geeigneter Stelle Doppelpunkte eingefügt werden und dass für jedes Segment immer zwei Ziffern (ggf. inklusive führender Null) vorhanden sind.

Mehr Formatierung

Sie könnten noch einen Schritt weiter gehen und andere Funktionen verwenden, wie zum Beispiel FORMAT() Funktion, um das run_date darzustellen und run_time Spalten in einem noch leserfreundlicheren Format.

SELECT TOP 15
	FORMAT(msdb.dbo.AGENT_DATETIME(run_date, run_time), 'U') AS RunDateTime
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;

Ergebnis:

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

Sie können mit dieser Funktion eine beliebige Anzahl anderer Formatbezeichner sowie ein Kulturargument verwenden.

Weitere Informationen und Beispiele finden Sie unter:

  • So formatieren Sie Datum und Uhrzeit in SQL Server
  • Standardformatzeichenfolgen für Datum und Uhrzeit
  • Benutzerdefinierte Formatzeichenfolgen für Datum und Uhrzeit

Ermitteln des Jobnamens

Die sysjobhistory Tabelle speichert keine Jobnamen. Es speichert nur ihre IDs.

Um den Jobnamen zusammen mit den Datums-/Uhrzeit-/Dauerdaten zurückzugeben, können Sie einen Join für sysjobs_view ausführen view (oder die sysjobs Tabelle), um den Jobnamen zu erhalten.

Hier ist ein Beispiel für eine Abfrage, die das tut:

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;

Ergebnis: