すべてのカレンダー日付を保持するデータを含むテーブル (実際にはビューですが、同じように機能することを願っています) と、その日が支払いをスケジュールする日であるかどうかを示すフラグがあります。このデータセットはいくつかのルールに基づいて生成されますが、当面の問題の範囲外です。ルールは、週に 1 回支払いを実行することです (ただし、これは 2 週間ごとなどに変更できます)。以下に表示される結果セットは、毎週金曜日 (7 日まで) に支払いを実行することを示しています。列は、実際の日付、支払日かどうかを示すフラグ、およびなんらかの休日かどうかを示すフラグです。
CREATE TABLE Schedule
(
DateValue DATE NOT NULL,
IsPaymentDay BIT NOT NULL,
IsHoliday BIT NOT NULL
)
INSERT INTO Schedule
VALUES ('2013-01-01', 0, 1)
INSERT INTO Schedule
VALUES ('2013-01-02', 0, 0)
INSERT INTO Schedule
VALUES ('2013-01-03', 0, 0)
INSERT INTO Schedule
VALUES ('2013-01-04', 1, 0)
INSERT INTO Schedule
VALUES ('2013-01-05', 0, 0)
INSERT INTO Schedule
VALUES ('2013-01-06', 0, 0)
INSERT INTO Schedule
VALUES ('2013-01-07', 0, 0)
INSERT INTO Schedule
VALUES ('2013-01-08', 0, 0)
INSERT INTO Schedule
VALUES ('2013-01-09', 0, 0)
INSERT INTO Schedule
VALUES ('2013-01-10', 0, 1)
INSERT INTO Schedule
VALUES ('2013-01-11', 1, 1)
INSERT INTO Schedule
VALUES ('2013-01-12', 0, 1)
INSERT INTO Schedule
VALUES ('2013-01-13', 0, 0)
INSERT INTO Schedule
VALUES ('2013-01-14', 0, 0)
INSERT INTO Schedule
VALUES ('2013-01-15', 0, 0)
INSERT INTO Schedule
VALUES ('2013-01-16', 0, 0)
INSERT INTO Schedule
VALUES ('2013-01-17', 0, 0)
INSERT INTO Schedule
VALUES ('2013-01-17', 0, 0)
INSERT INTO Schedule
VALUES ('2013-01-18', 1, 0)
INSERT INTO Schedule
VALUES ('2013-01-19', 0, 0)
INSERT INTO Schedule
VALUES ('2013-01-20', 0, 0)
SELECT * FROM Schedule
DROP TABLE Schedule
このコードを実行してデータを作成できます。
ここで、最後のビジネス ルールについて説明する必要があります。つまり、支払実行が祝日またはオフィスにスタッフがいない日 (クリスマス期間など) に当たる場合、システムはその場所が閉鎖される前日に支払実行を行う必要があります。休日の前日。
したがって、以下の例では、今年の最初の支払い実行は 1 月 4 日の金曜日です。これで問題ありません。予定通り出発します。
ただし、次の支払いは 1 月 11 日になります。実は10日から休業していて、13日から再開しています。したがって、この例では、9 日に実行される支払いを処理する必要があります。
いくつかの機能を持たせるために必要なもの。1 つは、「今日は支払い実行日ですか?」という質問に答えるものです。簡単に達成:
SELECT *
FROM Schedule WHERE DateValue = CAST(GETDATE() AS DATE)
AND IsPaymentDay = 1
これが支払い日である場合、これは行を返します。
ただし、オフィスが閉鎖される可能性があるという事実を考慮する必要があります。だから、私は言う必要があります:
SELECT *
FROM Schedule WHERE DateValue = CAST(GETDATE() AS DATE)
AND IsPaymentDay = 1
AND IsHoliday = 0
これは、その日が支払い日として問題ないかどうかを示します。しかし、今私は立ち往生しています。オフィスが開いている最後の日にこれを実行し、今日の「シャットダウン」期間内に支払いがあった場合、質問に対して TRUE の結果が返されるはずです。
したがって、9 日に実行すると、9 日が支払い日であることが示されるはずです。これは、支払い日が発生しない休日期間があるためです。
私が持っているいくつかのアイデアですが、それらを機能させることができるかどうかはわかりません:
日付が支払い日かどうかをチェックする関数を呼び出します...結果に応じて支払いを処理します...次に、次の支払い日を取得する関数を呼び出します。その日が休日の場合は、その日から現在までのすべての日付を選択し、最初に利用可能な支払い日が見つかるまでカーソルを戻します。その日付が今日の場合、プロセス。
でも、めんどくさそうです。誰かが私がこれをきちんと行うのを手伝ってくれることを願っています。