-1

SQL Server 2005 の組み込み機能から、30 ~ 35 分ごとに実行するようにスケジュールします。これは以下のクエリです。

UPDATE PREMIUM_SERVICE2 SET ndays = ndays - 1 
WHERE strAccountID NOT IN
    (SELECT strAccountID FROM CURRENTUSER) 
    AND ndays > 0 AND (PremStart < DATEADD(DAY,-1,GETDATE()))
DELETE FROM PREMIUM_SERVICE2 where nDays = 0

しかし、1つの問題があります。ウェブサイトからプレミアムを取得すると、それが追加されます10/11/2013 11:50:40 PM。つまり、上記の 2 つのクエリが実行されると、約 1 日ではなく、 30 分ごとに常に-1オンになります。nDaysだから、私はそれを次のように追加することを考えました:

UPDATE PREMIUM_SERVICE2 SET ndays = ndays - 1, PremStart = GetDate() 
WHERE strAccountID NOT IN
    (SELECT strAccountID FROM CURRENTUSER) 
AND ndays > 0 AND (PremStart < DATEADD(DAY,-1,GETDATE()))
DELETE FROM PREMIUM_SERVICE2 where nDays = 0

そのため、更新時に更新も行われますPremStartが、30 分を逃す可能性があり、30 日間のプレミアムがある場合は、少なくとも 1 日は誤って追加される可能性があるため、それは悪いことです。スケジュールされたジョブは 30 分ごとに実行されます。では、最初のクエリを編集して、より正確になり、実際に合格した場合にのみ実際に 1 日を差し引くにはどうすればよいでしょうか? 皆さんが私の言いたいことを理解してくれることを願っています。SQL Server 2005 を使用しています

4

1 に答える 1

0

プレミアム期間に関連して使用されるすべての属性は何ですか? 開始日時と残り日数だけですか?カウンターが 1 日 1 回作動するのであれば十分ですが、30 ~ 35 分に 1 回ですか? ある時点で、 がnDays今日すでに減算されているかどうかを知る必要が生じます。これら 2 つの列だけでは、それを判断できません。これが問題です。

固定された初期値に基づいて毎回計算するのではなく、残りの日数を知る必要があるものがテーブル内の専用の列からその値を読み取る必要がある場合は、もう 1 つの列を割り当てる必要があります。何らかの形で終点を取得します。これが、クエリを 1 日に複数回実行したときに残りの日数を追跡できると想像できる唯一の方法です。

たとえば、3 番目の列は、プレミアム期間の最初の長さである可能性があります。そうすれば、次のステートメントを使用して更新できますndays

UPDATE PREMIUM_SERVICE2
SET ndays = TotalDays - DATEDIFF(MINUTE, PremStart, GETDATE()) / 1440
WHERE strAccountID NOT IN
    (SELECT strAccountID FROM CURRENTUSER) 
    AND ndays > 0
;

TotalDays3 番目の列の名前です。ご覧のとおり、ndaysは単純に減分されるのではなく、実行ごとに計算されます。

これは、事前に計算された値を取得する代わりに、アプリケーション (または値を必要とするもの) が実際にndays実行できることです。つまり、残りの日数を要求するために使用されるクエリにその式を入れて、ndays. 当然のことながら、DELETE ステートメントを変更して、ndays条件を上記と同じ式を使用するもの、またはそれに類似したものに置き換えて、どの行を削除する必要があるかを確認する必要もあります。

ndaysといっても、絶対に必要ないとは言いません。それを持っていることには価値がある可能性があり、特定のケースでそれを割り当てることには意味があるかもしれませんが、何らかの形で終点を覚えておく必要があります.

対処すべき潜在的な問題がもう 1 つあります。主に の新しい計算方法から生じますndays。スクリプトを実行しているジョブが何らかの理由で遅延した場合 (一時停止してから再開した場合)、理論的には負ndaysの値になる可能性があるため、そのような条件を条件として使用する DELETE ステートメントndays = 0はそれらを見逃すことになります。したがって、条件を に変更しますndays <=0

于 2013-10-14T00:38:22.490 に答える