sql >> Database teknologi >  >> RDS >> Sqlserver

Formater sysjobhistorie, dato og varighed Kolonner i SQL Server

Hvis du nogensinde har forespurgt sysjobhistory tabel i msdb database, vil du sikkert vide, at dato- og varighedskolonnerne er gemt som heltal.

Især når du forespørger i denne tabel, er run_date , run_time og duration kolonner returneres som heltal, hvilket kan gøre det svært at læse.

Nedenfor er en forespørgsel, du kan bruge til at returnere disse data i et lettere læseligt format.

Problemet

Lad os først se på, hvordan disse kolonner returneres:

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ådan opbevares/præsenteres hver kolonne:

  • run_date kolonne er gemt i formatet ÅÅÅÅMMDD.
  • run_time kolonne er gemt i HHMMSS-format på et 24-timers ur. Men der er ingen foranstillede nuller.
  • run_duration kolonne er gemt i HHMMSS-format. Igen er der ingen foranstillede nuller. Derudover er der ingen koloner til at hjælpe os med at skelne mellem hvert segment. Så i ovenstående eksempel blev det første job afsluttet på 6 minutter og 25 sekunder, det andet job afsluttet på 1 minut og 28 sekunder, og det tredje job blev afsluttet på 17 sekunder.

Når du først ved, hvordan formateringen fungerer, er det normalt ikke så svært at finde ud af det. Men det kan være uintuitivt for os mennesker at læse.

Løsningen

Her er en løsning, der præsenterer dataene i et mere menneskeligt 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

Her bruger jeg den udokumenterede AGENT_DATETIME() funktion til at konvertere run_date og run_time kolonner til et mere læsbart format.

Jeg bruger derefter en række T-SQL-funktioner (STUFF() , RIGHT() , CAST() , og REPLICATE() ) for at få run_duration kolonne til et mere menneskeligt læsbart format. Disse sikrer, at der er indsat koloner på et passende sted, og at der altid er to cifre (inklusive et indledende nul, hvis det er nødvendigt) for hvert segment.

Mere formatering

Du kan tage det et skridt videre og bruge andre funktioner, såsom FORMAT() funktion til at præsentere run_date og run_time kolonner i et format, der er endnu mere læservenligt.

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 bruge et hvilket som helst antal andre formatspecifikationer med denne funktion, såvel som et kulturargument.

For mere information og eksempler, se:

  • Sådan formateres dato og klokkeslæt i SQL Server
  • Standard dato- og tidsformatstrenge
  • Tilpassede dato- og tidsformatstrenge

Få jobnavnet

sysjobhistory tabel gemmer ikke jobnavne. Den gemmer kun deres ID'er.

For at returnere jobnavnet sammen med dato/klokkeslæt/varighedsdata kan du udføre en joinforbindelse på sysjobs_view view (eller sysjobs tabel) for at få jobnavnet.

Her er et eksempel på en forespørgsel, der 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. Næsten nul nedetid automatiserede opgraderinger af PostgreSQL-klynger i skyen (del I)

  2. SQL Server:Sådan vælger du alle dage i et datointerval, selvom der ikke eksisterer nogen data i nogle dage

  3. Den hurtigste måde at kontrollere, om nogle poster i en databasetabel?

  4. MySQL 8.0 - Klienten understøtter ikke godkendelsesprotokol anmodet af serveren; overveje at opgradere MySQL-klienten