Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Calculating Job finish time

So msdb.dbo.sysjobhistory has start time and some integers out of which you can calculate an end time

SELECT CONVERT(datetime, msdb.dbo.agent_datetime(run_date, run_time))+
        CONVERT(datetime, STUFF(STUFF(RIGHT('000000' + CAST ( run_duration AS VARCHAR(6 ) ) ,6),5,0,':'),3,0,':') ) As JobFinishTime
 FROM  msdb.dbo.sysjobs j  
 INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id  
 where h.step_id = 0 AND h.run_status=1 AND j.enabled = 1  
 AND  j.enabled = 1

so one of my jobs has run_duration value of 250910, which is 25 hours, 9 minutes, 10 seconds. Obviously conversion fails since it is more than 24 hours. Can you please help me fix above query when value of run_duration is 250910

Use this as reference, filled run_date and run_time with some values

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

select CONVERT(datetime, msdb.dbo.agent_datetime(20230411, 70358))+
        CONVERT(datetime, STUFF(STUFF(RIGHT('000000' + CAST ( 250910 AS VARCHAR(6 ) ) ,6),5,0,':'),3,0,':') ) 

>Solution :

As I understand your question, you have a start date and a duration expressed as a string in ‘HHMMSS’ format, from which you want to derive an end date. One approach uses string functions to separate the hours, minutes and seconds, convert the whole thing to a number of seconds, and then offset the start date with dateadd().

Assuming that you have the start date in column jobStartTime and the duration in runDuration, you could express this like:

dateadd(
    second, 
    left(runDuration, 2) * 60 * 60 + substring(runDuration, 3, 2) * 60 + right(runDuration, 2),
    jobStartTime
) JobFinishTime

Here is a contrived example:

select x.*, 
    dateadd(
        second, 
        left(duration, 2) * 60 * 60 + substring(duration, 3, 2) * 60 + right(duration, 2),
        startdt
    ) enddt
from ( values (getdate(), '250910')) as x(startdt, duration)
startdt duration enddt
2023-05-02 13:34:12.203 250910 2023-05-03 14:43:22.203

fiddle

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading