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: