まず、sysschedulesを参照してください。しかし、私が理解する限り、タイプミスがあります。 active_start_dateとそのジョブ をactive_end_date間のいずれかの日にこの
active_start_time時間が実行を開始します。時間は、24時間制を使用してHHMMSSでフォーマットされます。
はactive_start_timeとジョブ が実行を開始active_end_time間のいずれかの日に
active_start_time時間として読まれるべきです。時間は、24時間制を使用してHHMMSSでフォーマットされます。
そして、これを考慮してください。
active_start_dateジョブの実行を開始することができた上日。日付は YYYYMMDDの形式です。 NULLは今日の日付を示します。あなたが毎日毎時間を開始するために、定期的なジョブを構成し、active_start_time = 100000とactive_start_date = 20120323を設定した場合、ジョブは2012年3月23日午前10時までに実行されないことを意味します
。
ただし、実行中のタスクを作成する場合、このフィールドには正確な開始日時が含まれています。
一致するイベントを見つけるために、私の意見は次のとおりです。重要なもの(スケジュールの種類や開始時刻など)を更新する場合、または定期的なスケジュールで次のジョブの実行が発生した場合、SQLエージェントはスケジュールの次の実行時間を計算し、sysjobschedules.next_run_date
に格納します。
したがって、常に次回の実行のリストがあり、「特定の日付の一致するイベントを見つける」という問題は解決しません。そして、私は同じ方法であなたのシステムを実装すべきだと思います。
しかし、あなたがそのようなやり方をしているのであれば、私たちはそれについてT-SQLのクエリについて考えることができます。あなたの仕事のお手伝いをすることができます
スクリプト以下
UPDATE。現在のところ、2つのタイプのスケジュールに対応しています。
1.開始1回
2. N日ごとに1日に1回開始
あなたのコメントから理解する限り、それらを使用します。追加のタイプは、同じ方法で必要になるとすぐに追加できます(UNION ALL ... UNION ALL ...
)。
機能msdb_time_convert
は、HHMMSS整数をTIMEデータ型に変換します。
CREATE FUNCTION msdb_time_convert (
@int_time INT
)
RETURNS TIME(0)
AS
BEGIN
IF NOT (@int_time BETWEEN 0 AND 235959)
RETURN NULL
DECLARE @str VARCHAR(32) = CAST(@int_time AS VARCHAR(32))
SELECT @str = REPLICATE('0', 6 - LEN(@str)) + @str
SELECT @str = STUFF(@str, 3, 0, ':')
SELECT @str = STUFF(@str, 6, 0, ':')
RETURN CONVERT(TIME(0), @str, 108)
END
GO
あなたは、時間の異なるポイントで、次の実行を見つけること@find_date
変数に任意の日時を指定することができます。
DECLARE @find_date DATETIME = GETDATE()
;WITH CTE AS (
SELECT
CONVERT(DATE, CAST(active_start_date AS VARCHAR(32)), 112) AS active_start_date,
CONVERT(DATE, CAST(active_end_date AS VARCHAR(32)), 112) AS active_end_date,
dbo.msdb_time_convert(active_start_time) AS active_start_time,
dbo.msdb_time_convert(active_end_time) AS active_end_time,
schedule_id,
schedule_uid,
name,
enabled,
freq_type,
freq_interval,
freq_subday_type,
freq_subday_interval,
freq_relative_interval,
freq_recurrence_factor,
CAST(@find_date AS DATE) AS today_date,
CAST(@find_date AS TIME(0)) AS today_time,
DATEADD(day, DATEDIFF(day, CONVERT(DATETIME, CAST(active_start_date AS VARCHAR(32)), 112) - 1, @find_date) % NULLIF(freq_interval, 0), CAST(@find_date AS DATE)) AS next_daily_day
FROM dbo.sysschedules
)
SELECT
schedule_id,
name,
CAST(active_start_date AS DATETIME) + active_start_time AS next_run_datetime
FROM CTE
WHERE
enabled = 1
AND freq_type = 1 -- 1 = One time only
AND CAST(active_start_date AS DATETIME) + active_start_time >= @find_date
UNION ALL
SELECT
schedule_id,
name,
DATEADD(
DAY,
CASE WHEN CAST(next_daily_day AS DATETIME) + active_start_time > @find_date THEN 0 ELSE freq_interval END,
CAST(next_daily_day AS DATETIME) + active_start_time
) AS next_run_datetime
FROM CTE
WHERE
enabled = 1
AND freq_type = 4 -- 4 = Daily (Every freq_interval days)
AND freq_subday_type = 1 -- 1 = At the specified time
AND CAST(active_end_date AS DATETIME) + active_end_time >= @find_date
'sysschedules'は使用できません。これらの質問に答えると、自分の行などを挿入してこのテーブルを使用しようとしていますか?それとも、デザイン後に独自のユーザーテーブルをモデル化するためにそれを理解しようとしているだけですか? –
私は同じテーブルを使用していません。スキーマをコピーして新しいテーブルを作成しました。 – user1255409