2012-03-21 8 views
4

定期的なイベントカレンダーを開発しようとしています。 msdbデータベース内のsysschedulesテーブルのように見えます。イベント用テーブルのようなsysschedulesの使用SQL Server

しかし、私はいくつかの課題に直面しており、誰かが助けてくれることを望んでいます。

a)active_start_date:これはイベントが初めて発生する日ですか?またはイベント開始日以前の任意の日付ですか?

b)特定の日付の一致するイベント(一度、毎日、毎週、毎月など)を見つけるにはどうすればよいですか?

編集:私は直接sysschedulesテーブルを使用していません。むしろ、同じ列を持つ新しいテーブルを作成しました。

+0

'sysschedules'は使用できません。これらの質問に答えると、自分の行などを挿入してこのテーブルを使用しようとしていますか?それとも、デザイン後に独自のユーザーテーブルをモデル化するためにそれを理解しようとしているだけですか? –

+0

私は同じテーブルを使用していません。スキーマをコピーして新しいテーブルを作成しました。 – user1255409

答えて

4

まず、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 
+0

私の英語は申し訳ありません。そのような長いスピーチではそれほど良いことではありません:) –

+0

Andrey、active_start_timeは最初の実行時間です。私の意図は、イベントカレンダーに使用することです。私は、next_run_timeの計算は、ここでは私の場合はオプションではないと推測しています。むしろ私の最初の推測は、x日数の一致するイベントを見つけることです。例えば、もし私が、2012年3月22日から3月27日に発生する予定のイベントを見つけたら、私はこれらの7日間ループし、毎日のための一致するイベントを取得します。これは私が立ち往生している場所で、これらのイベントを取得するためのクエリです。 – user1255409

+0

OK。私は答えを更新しました。それを試してみてください、それが役に立つと信じてください。 –

関連する問題