Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Determining when a sql server schedule will trigger within a time span?

In a system I manage there are several SQL Server Agent jobs that run based off schedules defined within dbo.sysschedules.

I would like to create a calendar view on my application that will display when each of these jobs would be scheduled to run in given time span. For example, if I have schedule that's set to run on the first and fourth Monday of the month at 8:00 AM, then given the timespan of the current month (4/2013) I would like to get the dates "4/1/2013 8:00AM, 4/22/2013 8:00AM" back.

Has anyone come across a method for accomplishing this? I know that I could read in the schedule definition and figure this out pragmatically, but I was curious whether anyone has already come up with the solution before I get into the weeds myself.

Thanks!

like image 597
Sidawy Avatar asked Nov 12 '22 07:11

Sidawy


1 Answers

These links look like they will get you on the right path...

Generate SQL Agent Job Schedule

Accessing SQL Server Agent Data

Here is a solution I altered from mssqltips.com.

    WITH next_run_time AS
    (       
    SELECT      sJOBSCH.schedule_id AS  [ScheduleID]            
                ,[sJOB].[name] AS [JobName]
                ,CASE 
                WHEN [sJOBH].[run_date] IS NULL OR [sJOBH].[run_time] IS NULL THEN NULL
                ELSE CAST(
                CAST([sJOBH].[run_date] AS CHAR(8))
                + ' ' 
                + STUFF(
                STUFF(RIGHT('000000' + CAST([sJOBH].[run_time] AS VARCHAR(6)),  6)
                    , 3, 0, ':')
                , 6, 0, ':')
                AS DATETIME)
                END AS [LastRunDateTime]
                , CASE [sJOBSCH].[NextRunDate]
                WHEN 0 THEN NULL
                ELSE CAST(
                CAST([sJOBSCH].[NextRunDate] AS CHAR(8))
                + ' ' 
                + STUFF(
                    STUFF(RIGHT('000000' + CAST([sJOBSCH].[NextRunTime] AS VARCHAR(6)),  6)
                    , 3, 0, ':')
                , 6, 0, ':')
                AS DATETIME)
                END AS [NextRunDateTime]
    FROM        [msdb].[dbo].[sysjobs] AS [sJOB]
    LEFT JOIN 
    (
    SELECT      [job_id]
                ,schedule_id
                ,MIN([next_run_date]) AS [NextRunDate]
                ,MIN([next_run_time]) AS [NextRunTime]
    FROM        [msdb].[dbo].[sysjobschedules]
    GROUP BY    [job_id],schedule_id
    )       AS [sJOBSCH]

    ON      [sJOB].[job_id] = [sJOBSCH].[job_id]
    LEFT JOIN 
    (
    SELECT      [job_id]
                ,[run_date]
                ,[run_time]
                ,ROW_NUMBER() OVER (PARTITION BY [job_id] ORDER BY [run_date] DESC, [run_time] DESC

    )           AS RowNumber

    FROM        [msdb].[dbo].[sysjobhistory]
    WHERE       [step_id] = 0
    )       AS  [sJOBH]

        ON      [sJOB].[job_id] = [sJOBH].[job_id]
    AND         [sJOBH].[RowNumber] = 1
    )

    , Occurrence AS
    (
    SELECT      schedule_id AS [ScheduleID]
                ,[schedule_uid] AS [ScheduleUID]
                ,[name] AS [ScheduleName]
                ,CASE [enabled]
                WHEN 1 THEN 'Yes'
                WHEN 0 THEN 'No'
                END AS [IsEnabled]
                ,CASE 
                WHEN [freq_type] = 64 THEN 'Start automatically when SQL Server Agent starts'
                WHEN [freq_type] = 128 THEN 'Start whenever the CPUs become idle'
                WHEN [freq_type] IN (4,8,16,32) THEN 'Recurring'
                WHEN [freq_type] = 1 THEN 'One Time'
                END [ScheduleType]
                ,CASE [freq_type]
                WHEN 1 THEN 'One Time'
                WHEN 4 THEN 'Daily'
                WHEN 8 THEN 'Weekly'
                WHEN 16 THEN 'Monthly'
                WHEN 32 THEN 'Monthly - Relative to Frequency Interval'
                WHEN 64 THEN 'Start automatically when SQL Server Agent starts'
                WHEN 128 THEN 'Start whenever the CPUs become idle'
                END [Occurrence]
                ,CASE [freq_type]
                WHEN 4 THEN 'Occurs every ' + CAST([freq_interval] AS VARCHAR(3)) + ' day(s)'
                WHEN 8 THEN 'Occurs every ' + CAST([freq_recurrence_factor] AS VARCHAR(3)) 
                        + ' week(s) on '
                        + CASE WHEN [freq_interval] & 1 = 1 THEN 'Sunday' ELSE '' END
                        + CASE WHEN [freq_interval] & 2 = 2 THEN ', Monday' ELSE '' END
                        + CASE WHEN [freq_interval] & 4 = 4 THEN ', Tuesday' ELSE '' END
                        + CASE WHEN [freq_interval] & 8 = 8 THEN ', Wednesday' ELSE '' END
                        + CASE WHEN [freq_interval] & 16 = 16 THEN ', Thursday' ELSE '' END
                        + CASE WHEN [freq_interval] & 32 = 32 THEN ', Friday' ELSE '' END
                        + CASE WHEN [freq_interval] & 64 = 64 THEN ', Saturday' ELSE '' END
                WHEN 16 THEN 'Occurs on Day ' + CAST([freq_interval] AS VARCHAR(3)) 
                             + ' of every '
                             + CAST([freq_recurrence_factor] AS VARCHAR(3)) + ' month(s)'
                WHEN 32 THEN 'Occurs on '
                         + CASE [freq_relative_interval]
                            WHEN 1 THEN 'First'
                            WHEN 2 THEN 'Second'
                            WHEN 4 THEN 'Third'
                            WHEN 8 THEN 'Fourth'
                            WHEN 16 THEN 'Last'
                           END
                         + ' ' 
                         + CASE [freq_interval]
                            WHEN 1 THEN 'Sunday'
                            WHEN 2 THEN 'Monday'
                            WHEN 3 THEN 'Tuesday'
                            WHEN 4 THEN 'Wednesday'
                            WHEN 5 THEN 'Thursday'
                            WHEN 6 THEN 'Friday'
                            WHEN 7 THEN 'Saturday'
                            WHEN 8 THEN 'Day'
                            WHEN 9 THEN 'Weekday'
                            WHEN 10 THEN 'Weekend day'
                           END
                         + ' of every ' + CAST([freq_recurrence_factor] AS VARCHAR(3)) 
                         + ' month(s)'
                END AS [Recurrence]
                ,CASE [freq_subday_type]
                WHEN 1 THEN 'Occurs once at ' 
                        + STUFF(
                     STUFF(RIGHT('000000' + CAST([active_start_time] AS VARCHAR(6)), 6)
                                    , 3, 0, ':')
                                , 6, 0, ':')
                WHEN 2 THEN 'Occurs every ' 
                        + CAST([freq_subday_interval] AS VARCHAR(3)) + ' Second(s) between ' 
                        + STUFF(
                       STUFF(RIGHT('000000' + CAST([active_start_time] AS VARCHAR(6)), 6)
                                    , 3, 0, ':')
                                , 6, 0, ':')
                        + ' & ' 
                        + STUFF(
                        STUFF(RIGHT('000000' + CAST([active_end_time] AS VARCHAR(6)), 6)
                                    , 3, 0, ':')
                                , 6, 0, ':')
                WHEN 4 THEN 'Occurs every ' 
                        + CAST([freq_subday_interval] AS VARCHAR(3)) + ' Minute(s) between ' 
                        + STUFF(
                       STUFF(RIGHT('000000' + CAST([active_start_time] AS VARCHAR(6)), 6)
                                    , 3, 0, ':')
                                , 6, 0, ':')
                        + ' & ' 
                        + STUFF(
                        STUFF(RIGHT('000000' + CAST([active_end_time] AS VARCHAR(6)), 6)
                                    , 3, 0, ':')
                                , 6, 0, ':')
                WHEN 8 THEN 'Occurs every ' 
                        + CAST([freq_subday_interval] AS VARCHAR(3)) + ' Hour(s) between ' 
                        + STUFF(
                        STUFF(RIGHT('000000' + CAST([active_start_time] AS VARCHAR(6)), 6)
                                    , 3, 0, ':')
                                , 6, 0, ':')
                        + ' & ' 
                        + STUFF(
                        STUFF(RIGHT('000000' + CAST([active_end_time] AS VARCHAR(6)), 6)
                                    , 3, 0, ':')
                                , 6, 0, ':')
                END [Frequency]
                ,STUFF(
                    STUFF(CAST([active_start_date] AS VARCHAR(8)), 5, 0, '-')
                        , 8, 0, '-') AS [ScheduleUsageStartDate]
                ,STUFF(
                STUFF(CAST([active_end_date] AS VARCHAR(8)), 5, 0, '-')
                    , 8, 0, '-') AS [ScheduleUsageEndDate]
                ,[date_created] AS [ScheduleCreatedOn]
                ,[date_modified] AS [ScheduleLastModifiedOn]
    FROM        [msdb].[dbo].[sysschedules]

    )

    Select      nrt.JobName,nrt.LastRunDateTime,nrt.NextRunDateTime
                ,o.Occurrence,o.Recurrence
    From        next_run_time AS nrt
    Inner Join  Occurrence o
        ON      nrt.ScheduleID = o.ScheduleID

And the results from this query for me.

JobName===========syspolicy_purge_history

LastRunDateTime====4/23/13 19:47

NextRunDateTime====4/24/13 2:00

Occurrence=========Daily

Recurrence=========Occurs every 1 day(s)

like image 93
Brian Boyd Avatar answered Nov 15 '22 07:11

Brian Boyd