Als je ooit de sysjobhistory
. hebt opgevraagd tabel in de msdb
database, weet u waarschijnlijk dat de kolommen datum/tijd en duur worden opgeslagen als gehele getallen.
In het bijzonder, wanneer u deze tabel opvraagt, wordt de run_date
, run_time
, en duration
kolommen worden geretourneerd als gehele getallen, wat het lezen moeilijk kan maken.
Hieronder vindt u een zoekopdracht die u kunt gebruiken om deze gegevens in een gemakkelijker leesbaar formaat terug te geven.
Het probleem
Laten we eerst eens kijken hoe deze kolommen worden geretourneerd:
SELECT TOP 15
run_date,
run_time,
run_duration
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
Resultaat:
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
Zo wordt elke kolom opgeslagen/gepresenteerd:
- De
run_date
kolom wordt opgeslagen in de indeling JJJJMMDD. - De
run_time
kolom wordt opgeslagen in HMMMSS-formaat op een 24-uurs klok. Maar er zijn geen voorloopnullen. - De
run_duration
kolom wordt opgeslagen in HMMMSS-indeling. Nogmaals, er zijn geen voorloopnullen. Bovendien zijn er geen dubbele punten om ons te helpen onderscheid te maken tussen elk segment. Dus in het bovenstaande voorbeeld eindigde de eerste taak in 6 minuten en 25 seconden, de tweede taak eindigde in 1 minuut en 28 seconden en de derde taak eindigde in 17 seconden.
Als je eenmaal weet hoe de opmaak werkt, is het meestal niet zo moeilijk om erachter te komen. Maar het kan voor ons mensen niet intuïtief zijn om te lezen.
De oplossing
Hier is een oplossing die de gegevens in een voor mensen leesbaar formaat presenteert:
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;
Resultaat:
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 gebruik ik de ongedocumenteerde AGENT_DATETIME()
functie om de run_date
. te converteren en run_time
kolommen in een beter leesbaar formaat.
Ik gebruik dan een reeks T-SQL-functies (STUFF()
, RIGHT()
, CAST()
, en REPLICATE()
) om de run_duration
. te krijgen kolom in een meer voor mensen leesbare indeling. Deze zorgen ervoor dat dubbele punten op een geschikte plaats worden ingevoegd en dat er altijd twee cijfers zijn (inclusief een voorloopnul indien nodig) voor elk segment.
Meer opmaak
Je zou nog een stap verder kunnen gaan en andere functies gebruiken, zoals de FORMAT()
functie om de run_date
. te presenteren en run_time
kolommen in een nog leesvriendelijker formaat.
SELECT TOP 15
FORMAT(msdb.dbo.AGENT_DATETIME(run_date, run_time), 'U') AS RunDateTime
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
Resultaat:
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
U kunt met deze functie een willekeurig aantal andere formaatspecificaties gebruiken, evenals een cultuurargument.
Voor meer informatie en voorbeelden, zie:
- De datum en tijd opmaken in SQL Server
- Standaard tekenreeksen voor datum- en tijdnotatie
- Aangepaste tekenreeksen voor datum- en tijdnotatie
De taaknaam ophalen
De sysjobhistory
tabel slaat geen taaknamen op. Het slaat alleen hun ID's op.
Om de taaknaam samen met de datum/tijd/duurgegevens te retourneren, kunt u een join uitvoeren op de sysjobs_view
bekijken (of de sysjobs
tabel) om de taaknaam te krijgen.
Hier is een voorbeeld van een zoekopdracht die dat doet:
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;
Resultaat: