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: