sql >> Database >  >> RDS >> Sqlserver

Formatteer sysjobhistory datetime &duration Kolommen in SQL Server

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:


  1. null vs lege string in Oracle

  2. LOWER() – Converteren naar kleine letters in PostgreSQL

  3. Afstemmen van SQL Server Reporting Services

  4. SQL FLOAT:3 punten die u zullen helpen rare rekenfouten te vermijden