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

Formatta colonne sysjobhistory datetime e durata in SQL Server

Se hai mai interrogato sysjobhistory tabella nel msdb database, probabilmente saprai che le colonne datetime e duration sono memorizzate come numeri interi.

In particolare, quando si interroga questa tabella, il run_date , run_time e duration le colonne vengono restituite come numeri interi, il che può rendere difficile la lettura.

Di seguito è riportata una query che puoi utilizzare per restituire questi dati in un formato più facile da leggere.

Il problema

Per prima cosa, diamo un'occhiata a come vengono restituite queste colonne:

SELECT TOP 15
	run_date,
	run_time,
	run_duration
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;

Risultato:

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

Ecco come viene archiviata/presentata ogni colonna:

  • Il run_date la colonna è memorizzata nel formato AAAAMMGG.
  • Il run_time colonna è memorizzata in formato HHMMSS su un orologio a 24 ore. Ma non ci sono zeri iniziali.
  • Il run_duration la colonna è memorizzata nel formato HHMMSS. Ancora una volta, non ci sono zeri iniziali. Inoltre non ci sono due punti per aiutarci a distinguere tra ogni segmento. Quindi, nell'esempio sopra, il primo lavoro è terminato in 6 minuti e 25 secondi, il secondo lavoro è terminato in 1 minuto e 28 secondi e il terzo lavoro è terminato in 17 secondi.

Una volta che sai come funziona la formattazione, di solito non è troppo difficile capirlo. Ma può essere poco intuitivo per noi umani leggere.

La soluzione

Ecco una soluzione che presenta i dati in un formato più leggibile:

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;

Risultato:

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

Qui, utilizzo il AGENT_DATETIME() non documentato funzione per convertire il run_date e run_time colonne in un formato più leggibile.

Uso quindi una serie di funzioni T-SQL (STUFF() , RIGHT() , CAST() e REPLICATE() ) per ottenere il run_duration colonna in un formato più leggibile. Questi assicurano che ci siano i due punti inseriti in un punto adatto e che ci siano sempre due cifre (incluso uno zero iniziale se necessario) per ogni segmento.

Più formattazione

Potresti fare un ulteriore passo avanti e utilizzare altre funzioni, come FORMAT() funzione per presentare il run_date e run_time colonne in un formato ancora più facile da leggere.

SELECT TOP 15
	FORMAT(msdb.dbo.AGENT_DATETIME(run_date, run_time), 'U') AS RunDateTime
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;

Risultato:

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

È possibile utilizzare un numero qualsiasi di altri identificatori di formato con questa funzione, nonché un argomento delle impostazioni cultura.

Per ulteriori informazioni ed esempi, vedere:

  • Come formattare la data e l'ora in SQL Server
  • Stringhe di formato di data e ora standard
  • Stringhe di formato di data e ora personalizzate

Ottenere il nome del lavoro

La sysjobhistory la tabella non memorizza i nomi dei lavori. Memorizza solo i loro ID.

Per restituire il nome del lavoro insieme ai dati di data/ora/durata, puoi eseguire un join su sysjobs_view view (o sysjobs tabella) per ottenere il nome del lavoro.

Ecco un esempio di query che lo fa:

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;

Risultato: