Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Formatar sysjobhistory datetime &duration Colunas no SQL Server


Se você já consultou o sysjobhistory tabela no msdb banco de dados, você provavelmente saberá que as colunas de data e hora e duração são armazenadas como números inteiros.

Em particular, quando você consulta esta tabela, o run_date , run_time e duration colunas são retornadas como números inteiros, o que pode dificultar a leitura.

Abaixo está uma consulta que você pode usar para retornar esses dados em um formato mais fácil de ler.

O problema


Primeiro, vamos ver como essas colunas são retornadas:
SELECT TOP 15
	run_date,
	run_time,
	run_duration
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;

Resultado:
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

Veja como cada coluna é armazenada/apresentada:
  • O run_date coluna é armazenada no formato AAAAMMDD.
  • O run_time coluna é armazenada no formato HHMMSS em um relógio de 24 horas. Mas não há zeros à esquerda.
  • A run_duration coluna é armazenada no formato HHMMSS. Novamente, não há zeros à esquerda. Além disso, não há dois pontos para nos ajudar a distinguir entre cada segmento. Portanto, no exemplo acima, o primeiro trabalho foi concluído em 6 minutos e 25 segundos, o segundo em 1 minuto e 28 segundos e o terceiro em 17 segundos.

Depois de saber como a formatação funciona, geralmente não é muito difícil descobrir. Mas pode ser pouco intuitivo para nós, humanos, ler.

A solução


Aqui está uma solução que apresenta os dados em um formato mais legível:
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;

Resultado:
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

Aqui, eu uso o AGENT_DATETIME() não documentado função para converter o run_date e run_time colunas em um formato mais legível.

Eu então uso uma série de funções T-SQL (STUFF() , RIGHT() , CAST() e REPLICATE() ) para obter a run_duration coluna em um formato mais legível. Isso garante que haja dois-pontos inseridos em um local adequado e que sempre haja dois dígitos (incluindo um zero à esquerda, se necessário) para cada segmento.

Mais formatação


Você pode dar um passo adiante e usar outras funções, como o FORMAT() função para apresentar o run_date e run_time colunas em um formato ainda mais fácil de ler.
SELECT TOP 15
	FORMAT(msdb.dbo.AGENT_DATETIME(run_date, run_time), 'U') AS RunDateTime
FROM msdb.dbo.sysjobhistory
ORDER BY run_duration DESC;

Resultado:
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

Você pode usar qualquer número de outros especificadores de formato com essa função, bem como um argumento de cultura.

Para obter mais informações e exemplos, consulte:
  • Como formatar a data e hora no SQL Server
  • Strings de formato padrão de data e hora
  • Strings de formato personalizado de data e hora

Obtendo o nome do trabalho


O sysjobhistory tabela não armazena nomes de trabalhos. Ele armazena apenas seus IDs.

Para retornar o nome do trabalho junto com os dados de data/hora/duração, você pode realizar uma junção no sysjobs_view view (ou o sysjobs table) para obter o nome do trabalho.

Aqui está um exemplo de uma consulta que faz isso:
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;

Resultado: