sql >> Databasteknik >  >> RDS >> Sqlserver

Formatera sysjobhistoria datum och varaktighet Kolumner i SQL Server

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:


  1. Finns det en prestandaträff med decimaldatatyper (MySQL / Postgres)

  2. SQL Server IN vs. FINNS Prestanda

  3. Få antalet misslyckade inloggningsförsök för en inloggning på grund av ett felaktigt lösenord i SQL Server (T-SQL)

  4. Exportera Oracle Table till Excel-kalkylblad