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: