3

ジョブの次の実行日を手動で計算する必要があります。手伝ってもらえますか?

4

4 に答える 4

6

使用できるジョブの次の実行日を取得するには、sysschedulesおよびsysjobschedulesテーブルを使用します

テーブルsysjobschedulesの next_run_date 列と next_runtime 列を確認します

next_run_date int ジョブが次に実行される予定の日付。日付の形式は YYYYMMDD です。

next_run_time int ジョブの実行がスケジュールされている時刻。時刻は HHMMSS 形式で、24 時間制を使用します。

このスクリプトを参照してください

Select sched.*,jobsched.* FROM msdb.dbo.sysschedules AS sched
inner Join msdb.dbo.sysjobschedules AS jobsched ON sched.schedule_id = jobsched.schedule_id

または、msdb.dbo.sp_help_jobscheduleストアド プロシージャを使用して、同じ情報を取得できます。

アップデート

next_run_dateを手動で計算する必要がある場合は、 sysschedulesテーブルを確認し、freq_interval、freq_subday_type、freq_subday_interval、freq_relative_interval、freq_recurrence_factor、active_start_date、active_start_time 列を確認して式を決定する必要があります。

このリンクをチェックして、使用例を確認してください。

于 2010-03-08T03:10:37.333 に答える
3

これを確認してください:

SELECT 

    J.NAME JOB, 

    DATEADD(SS,(H.RUN_TIME)%100,DATEADD(N,(H.RUN_TIME/100)%100,DATEADD(HH,H.RUN_TIME/10000,CONVERT(DATETIME,CONVERT(VARCHAR(8),H.RUN_DATE),112))))
    JOB_STARTED,  

    DATEADD(SS,((H.RUN_DURATION)%10000)%100,DATEADD(N,((H.RUN_DURATION)%10000)/100,DATEADD(HH,(H.RUN_DURATION)/10000,DATEADD(SS,(H.RUN_TIME)%100,DATEADD(N,(H.RUN_TIME/100)%100,DATEADD(HH,H.RUN_TIME/10000,CONVERT(DATETIME,CONVERT(VARCHAR(8),H.RUN_DATE),112)))))))
    JOB_COMPLETED,  

    CONVERT(VARCHAR(2),(H.RUN_DURATION)/10000) + ':' + 
    CONVERT(VARCHAR(2),((H.RUN_DURATION)%10000)/100)+ ':' + 
    CONVERT(VARCHAR(2),((H.RUN_DURATION)%10000)%100) RUN_DURATION,

    CASE H.RUN_STATUS 
    WHEN 0 THEN 'FAILED'
    WHEN 1 THEN 'SUCCEEDED'
    WHEN 2 THEN 'RETRY'
    WHEN 3 THEN 'CANCELED'
    WHEN 4 THEN 'IN PROGRESS'
    END RUN_STATUS
    ,CASE S.FREQ_TYPE 
    WHEN  1 THEN 'ONCE'
    WHEN  4 THEN ' DAILY'
    WHEN  8 THEN ' WEEKLY'
    WHEN  16 THEN ' MONTHLY'
    WHEN  32 THEN ' MONTHLY RELATIVE'
    WHEN  64 THEN ' WHEN SQL SERVER'
    ELSE 'N/A' END [FREQ]
    ,CASE 
    WHEN S.NEXT_RUN_DATE > 0 THEN DATEADD(N,(NEXT_RUN_TIME%10000)/100,DATEADD(HH,NEXT_RUN_TIME/10000,CONVERT(DATETIME,CONVERT(VARCHAR(8),NEXT_RUN_DATE),112)))  
    ELSE CONVERT(DATETIME,CONVERT(VARCHAR(8),'19000101'),112) END NEXT_RUN

FROM 

    MSDB..SYSJOBHISTORY H,
    MSDB..SYSJOBS J, 
    MSDB..SYSJOBSCHEDULES S,
    (
    SELECT 
            MAX(INSTANCE_ID) INSTANCE_ID
            ,JOB_ID 
    FROM MSDB..SYSJOBHISTORY GROUP BY JOB_ID
    ) M
WHERE 
    H.JOB_ID = J.JOB_ID 
AND 
    J.JOB_ID = S.JOB_ID 
AND 
    H.JOB_ID = M.JOB_ID 
AND 
    H.INSTANCE_ID = M.INSTANCE_ID

-- IF you want to check all job for today then uncomments below

-- AND 

--     RUN_DATE = (YEAR(GETDATE())*10000) + (MONTH(GETDATE()) * 100) + DAY(GETDATE())
ORDER BY NEXT_RUN 
于 2012-05-15T12:10:03.797 に答える
0

簡単に言えば、単一の式はなく、freq_type の値によって異なります。

執筆時点ではこのサイトはダウンしているようですが、http: //www.sqlmag.com/Article/ArticleID/99593/sql_server_99593.html に、この情報を取得する方法を説明した記事があります。残念ながら、このサイトでは Google がコンテンツをキャッシュすることを許可していないため、サイトが復旧するまでコンテンツを取得することはできません

これは、作成しようとしている種類のクエリの適切な代替ソースのように見えます。

于 2010-03-08T11:36:48.487 に答える