Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Обработка данных процедуры sp_help_jobhistory  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 761
Необходимо определить время последнего удачного выполнения джоба. Эта информация формируется процедурой msdb.dbo.sp_help_jobhistory. Но проблема в том, что там дата и время хранятся в разных столбцах да ещё имеют числовое значение.
При решении проблемы получился запрос:
 select convert(datetime,
    substring(date_job, 1, 4) + '-' + substring(date_job, 5, 2) + '-' + substring(date_job, 7, 2) + ' '
    + substring(time_job, 1, 2) + ':' + substring(time_job, 3, 2) + ':' + substring(time_job, 5, 2) +'.000'
    , 121
  ) as date_last22
  from (
    select 
      cast(date_job as varchar(8)) as date_job, 
      case len(cast(time_job as varchar(6))) when 6 then cast(time_job as varchar(6)) else '0'+cast(time_job as varchar(5)) end as time_job 
    from (
      select top 1 max(run_date) as date_job, max(run_time) as time_job 
      from openrowset('SQLOLEDB', 'Server=reports;Trusted_Connection=yes;', 'exec msdb.dbo.sp_help_jobhistory') 
      where job_name='getNewInfo' and run_status=1
      group by run_date
      order by date_job desc
    ) t  
  ) r

Но может быть эту задачу можно решить как-то проще?
11 май 16, 11:22    [19157019]     Ответить | Цитировать Сообщить модератору
 Re: Обработка данных процедуры sp_help_jobhistory  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
SELECT
	  j.job_id
	, j.name
	, j.date_modified
	, j.[enabled]
	, last_run_time = msdb.dbo.agent_datetime(h.run_date, h.run_time)
	, last_run_duration = STUFF(STUFF(RIGHT('000000' + CONVERT(VARCHAR(8), run_duration), 6), 5, 0, ':'), 3, 0, ':')
	, run_status =
		CASE h.run_status
			WHEN 0 THEN 'FAILED'
			WHEN 1 THEN 'SUCCEEDED'
			WHEN 2 THEN 'RETRY'
			WHEN 3 THEN 'CANCELED'
			WHEN 4 THEN 'RUNNING'
		END
FROM msdb.dbo.sysjobs j
LEFT JOIN (
	SELECT
		  job_id
		, run_date
		, run_time
		, run_status
		, run_duration
		, RowNumber = ROW_NUMBER() OVER (PARTITION BY job_id ORDER BY run_date DESC, run_time DESC) 
	FROM msdb.dbo.sysjobhistory
	WHERE step_id = 0
) h ON h.job_id = j.job_id AND h.RowNumber = 1
11 май 16, 11:30    [19157068]     Ответить | Цитировать Сообщить модератору
 Re: Обработка данных процедуры sp_help_jobhistory  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 761
AlanDenton, тут набо бы уточнить, что я работаю с MSMSQL 7.0 там нет процедуры msdb.dbo.agent_datetime

P.S. А так-то я конечно понял, что мне нужна именно она
11 май 16, 12:10    [19157439]     Ответить | Цитировать Сообщить модератору
 Re: Обработка данных процедуры sp_help_jobhistory  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 761
В общем маленько подумал, вышел вот такой запрос:
               select
      CONVERT(DATETIME, CONVERT(CHAR(8), date_job, 112) + ' ' 
      + STUFF(STUFF(RIGHT('000000' + CONVERT(VARCHAR(8), time_job), 6), 5, 0, ':'), 3, 0, ':'), 121)
    from (
      select job_name, max(run_date) as date_job, max(run_time) as time_job 
      from openrowset('SQLOLEDB', 'Server=reports;Trusted_Connection=yes;', 'exec msdb.dbo.sp_help_jobhistory') 
      where job_name='getNewInfo' and run_status=1
      group by job_name
    ) t  

Большего сделать видимо не получится
11 май 16, 12:35    [19157644]     Ответить | Цитировать Сообщить модератору
 Re: Обработка данных процедуры sp_help_jobhistory  [new]
Mr.Fontaine
Member

Откуда: у меня столько мыслей?
Сообщений: 761
А ещё проще без вложенного запроса
 select CONVERT(DATETIME, CONVERT(CHAR(8), max(run_date), 112) + ' ' 
    + STUFF(STUFF(RIGHT('000000' + CONVERT(VARCHAR(8), max(run_time)), 6), 5, 0, ':'), 3, 0, ':'), 121)
  from openrowset('SQLOLEDB', 'Server=reports;Trusted_Connection=yes;', 'exec msdb.dbo.sp_help_jobhistory') 
  where job_name='getNewInfo' and run_status=1
  group by job_name
11 май 16, 12:47    [19157724]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить