Om du någonsin har frågat efter sysjobhistory
tabellen i msdb
databas, vet du antagligen att kolumnerna datumtid och varaktighet lagras som heltal.
I synnerhet när du frågar den här tabellen, visas run_date
, run_time
och duration
kolumner returneras som heltal, vilket kan göra det svårt att läsa.
Nedan är en fråga som du kan använda för att returnera denna data i ett mer lättläst format.
Problemet
Låt oss först titta på hur dessa kolumner returneras:
SELECT TOP 15
run_date,
run_time,
run_duration
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
Resultat:
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
Så här lagras/presenteras varje kolumn:
run_date
kolumnen lagras i formatet ÅÅÅÅMMDD.run_time
kolumnen lagras i HHMMSS-format på en 24-timmars klocka. Men det finns inga inledande nollor.run_duration
kolumnen lagras i HHMMSS-format. Återigen, det finns inga inledande nollor. Dessutom finns det inga kolon som hjälper oss att skilja mellan varje segment. Så i exemplet ovan avslutades det första jobbet på 6 minuter och 25 sekunder, det andra jobbet avslutades på 1 minut och 28 sekunder och det tredje jobbet avslutades på 17 sekunder.
När du väl vet hur formateringen fungerar är det vanligtvis inte så svårt att ta reda på det. Men det kan vara ointuitivt för oss människor att läsa.
Lösningen
Här är en lösning som presenterar data i ett mer läsbart format:
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;
Resultat:
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
Här använder jag den odokumenterade AGENT_DATETIME()
funktion för att konvertera run_date
och run_time
kolumner till ett mer läsbart format.
Jag använder sedan en serie T-SQL-funktioner (STUFF()
, RIGHT()
, CAST()
, och REPLICATE()
) för att få run_duration
kolumn till ett mer mänskligt läsbart format. Dessa säkerställer att det finns kolon på lämplig plats och att det alltid finns två siffror (inklusive en inledande nolla om det behövs) för varje segment.
Mer formatering
Du kan ta det ett steg längre och använda andra funktioner, såsom FORMAT()
funktion för att presentera run_date
och run_time
kolumner i ett format som är ännu mer läsvänligt.
SELECT TOP 15
FORMAT(msdb.dbo.AGENT_DATETIME(run_date, run_time), 'U') AS RunDateTime
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;
Resultat:
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
Du kan använda valfritt antal andra formatspecifikationer med den här funktionen, såväl som ett kulturargument.
För mer information och exempel, se:
- Hur man formaterar datum och tid i SQL Server
- Stängar för standardformat för datum och tid
- Anpassade datum- och tidsformatsträngar
Få jobbnamnet
sysjobhistory
tabellen lagrar inte jobbnamn. Den lagrar bara deras ID.
För att returnera jobbnamnet tillsammans med datum/tid/varaktighetsdata kan du utföra en koppling på sysjobs_view
vyn (eller sysjobs
tabell) för att få jobbnamnet.
Här är ett exempel på en fråga som gör det:
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;
Resultat: