ジョブの次の実行日を手動で計算する必要があります。手伝ってもらえますか?
4 に答える
使用できるジョブの次の実行日を取得するには、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 列を確認して式を決定する必要があります。
このリンクをチェックして、使用例を確認してください。
これを確認してください:
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
簡単に言えば、単一の式はなく、freq_type の値によって異なります。
執筆時点ではこのサイトはダウンしているようですが、http: //www.sqlmag.com/Article/ArticleID/99593/sql_server_99593.html に、この情報を取得する方法を説明した記事があります。残念ながら、このサイトでは Google がコンテンツをキャッシュすることを許可していないため、サイトが復旧するまでコンテンツを取得することはできません
これは、作成しようとしている種類のクエリの適切な代替ソースのように見えます。