Skip to content

Job History View

A view over sysjobhistory that converts the packed run date/time/duration integers into readable start and end times.

Published Nov 7, 2006

SQL Agent stores job history as three packed integers - run_date (YYYYMMDD), run_time (HHMMSS) and run_duration (HHMMSS) - which makes any reporting a pain. This view decodes all three with the substring/char(7) trick, adds duration to start time to produce a real EndTime, and formats Duration as HH:MM:SS regardless of how many digits the raw value has. Drop it in msdb and every job history report gets proper timestamps.

CREATE VIEW JobHistory AS
select
	JobName,
	StepName,
	Convert(VarChar, StartTime, 109) as StartTime,
	Duration,
	Convert(VarChar, StartTime + cast('1/1/1900 ' + Duration as DateTime), 109) as EndTime
from
	(
		select
			j.name as JobName,
			jh.step_name as StepName,
			-- Add Run Duration Seconds
			dateadd(ss,cast(substring(cast(run_duration + 1000000 as char(7)),6,2) as int),
			-- Add Run Duration Minutes
			dateadd(mi, cast(substring(cast(run_duration + 1000000 as char(7)),4,2) as int),
			-- Add Run Duration Hours
			dateadd(hh, cast(substring(cast(run_duration + 1000000 as char(7)),2,2) as int),
			-- Add Start Time Seconds
			dateadd(ss, cast(substring(cast(run_time + 1000000 as char(7)),6,2) as int),
			-- Add Start Time Minutes
			dateadd(mi, cast(substring(cast(run_time + 1000000 as char(7)),4,2) as int),
			-- Add Start Time Hours
			dateadd(hh, cast(substring(cast(run_time + 1000000 as char(7)),2,2) as int),
			convert(datetime, cast(run_date as char(8))))
			))))) as StartTime,
			CASE len(jh.run_duration)
				WHEN 1 THEN cast('00:00:0' + cast(jh.run_duration as char) as char (8))
				WHEN 2 THEN cast('00:00:' + cast(jh.run_duration as char) as char (8))
				WHEN 3 THEN cast('00:0' + Left(right(jh.run_duration,3),1) +':' + right(jh.run_duration,2) as char (8))
				WHEN 4 THEN cast('00:' + Left(right(jh.run_duration,4),2) +':' + right(jh.run_duration,2) as char (8))
				WHEN 5 THEN cast('0' + Left(right(jh.run_duration,5),1) +':' + Left(right(jh.run_duration,4),2) +':' + right(jh.run_duration,2) as char (8))
				WHEN 6 THEN cast(Left(right(jh.run_duration,6),2) +':' + Left(right(jh.run_duration,4),2) +':' + right(jh.run_duration,2) as char (8))
			END as Duration
		from
			sysjobs as j
		inner join sysjobhistory as jh
			on jh.job_id = j.job_id
	) as jh
GO
An unhandled error has occurred. Reload 🗙