Olá Pessoal,
Bom dia.
Hoje vou mostrar rapidamente pra vocês, como converter as colunas run_date e run_time da tabela de catálogo do banco msdb.dbo.sysjobhistory para datetime. Atualmente, a coluna run_date é um varchar no formato yyyymmdd (Ex: 07/05/2015 = 20150507), e a coluna run_time é uma hora no formato hmmss (Ex: 08:27:00 = 82700). Até dá pra entender visualmente o que significam esses valores, mas o cálculo com essas datas e horas ficam bem mais complicado.
Para facilitar a consulta dessas informações, podemos combinar essas 2 colunas e convertê-las para datetime. Vou demonstrar duas formas de como fazer isso:
Utilizando a função de sistema msdb.dbo.agent_datetime
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
SELECT j.name, h.step_id, h.step_name, h.run_status, h.message, [RunDateTime] = msdb.dbo.agent_datetime(h.run_date, h.run_time), h.run_date, h.run_time FROM [msdb].[dbo].[sysjobs] j JOIN [msdb].[dbo].sysjobhistory h ON j.job_id = h.job_id WHERE h.run_status = 0 AND h.step_id = 0 |
Criando uma função personalizada
Apesar de já existir uma função de sistema para fazer isso (Agradecimentos a Caroline Goltara, pela dica), muitos DBA’s não gostam de conceder acesso a funções de sistema para analistas, mesmo sabendo o que função faz. Para contornar nisso, podemos criar uma função personalizada e liberar acesso nessa função para os analistas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
USE [Util] GO CREATE FUNCTION [dbo].[fncJobs_Converte_Datetime] ( @DATE INT, @TIME INT ) RETURNS datetime AS BEGIN DECLARE @Date_Time datetime DECLARE @Ds_Date VARCHAR(8) = @DATE DECLARE @Ds_Time VARCHAR(8) = @TIME IF (@DATE = 0) RETURN NULL SET @Ds_Time = RIGHT('000000'+@Ds_Time,6) SET @Ds_Time = SUBSTRING(@Ds_Time,1,2)+':'+SUBSTRING(@Ds_Time,3,2)+':'+SUBSTRING(@Ds_Time,5,2) SET @Date_Time = CAST(@Ds_Date + ' ' + @Ds_Time AS datetime) RETURN @Date_Time END |
E agora, vamos utilizar a função criada para exibir os resultados:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SELECT j.name, h.step_id, h.step_name, h.run_status, h.message, [RunDateTime] = Util.dbo.fncJobs_Converte_Datetime(h.run_date, h.run_time) FROM [msdb].[dbo].[sysjobs] j JOIN [msdb].[dbo].sysjobhistory h ON j.job_id = h.job_id WHERE h.run_status = 0 AND h.step_id = 0 |
O resultado final é exatamente o mesmo utilizando as duas funções, ficando como na imagem abaixo:
Opa… Show de bola
estava procurando exatamente isso..
a função do sistema salvou..
abras!