1

すべてのカレンダー日付を保持するデータを含むテーブル (実際にはビューですが、同じように機能することを願っています) と、その日が支払いをスケジュールする日であるかどうかを示すフラグがあります。このデータセットはいくつかのルールに基づいて生成されますが、当面の問題の範囲外です。ルールは、週に 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 日が支払い日であることが示されるはずです。これは、支払い日が発生しない休日期間があるためです。

私が持っているいくつかのアイデアですが、それらを機能させることができるかどうかはわかりません:

日付が支払い日かどうかをチェックする関数を呼び出します...結果に応じて支払いを処理します...次に、次の支払い日を取得する関数を呼び出します。その日が休日の場合は、その日から現在までのすべての日付を選択し、最初に利用可能な支払い日が見つかるまでカーソルを戻します。その日付が今日の場合、プロセス。

でも、めんどくさそうです。誰かが私がこれをきちんと行うのを手伝ってくれることを願っています。

4

3 に答える 3

1

このクエリを試してください

SELECT *
FROM Schedule 
WHERE (DateDiff(dd,GETDATE(),DateValue) = 0 AND IsPaymentDay = 1 AND IsHoliday = 0)
    OR ( DateDiff(dd,GETDATE(),DateValue) = 0 AND IsPaymentDay = 0 AND IsHoliday = 0 AND
         EXISTS( 
         SELECT *
         FROM Schedule holiday
         WHERE DateDiff(dd,GETDATE(),DateValue) BETWEEN 1 AND 6 AND IsPaymentDay = 1 AND IsHoliday = 1
               AND NOT EXISTS (SELECT *
                               FROM Schedule
                               WHERE DateDiff(dd,GETDATE(),Schedule.DateValue) >= 1 AND DateDiff(dd,Schedule.DateValue,holiday.DateValue)>=1
                                     AND Schedule.IsHoliday = 0 AND Schedule.IsPaymentDay=0)
         )
    )

ここでは、次の 7 日間をチェックします ( BETWEEN 1 AND 6)。要件に応じて、この値をティークできます。今日のすべてのレコードを確認する必要がある場合は、単に に変更し>=1ます。このような:

SELECT *
    FROM Schedule 
    WHERE (DateDiff(dd,GETDATE(),DateValue) = 0 AND IsPaymentDay = 1 AND IsHoliday = 0)
        OR ( DateDiff(dd,GETDATE(),DateValue) = 0 AND IsPaymentDay = 0 AND IsHoliday = 0 AND
             EXISTS( 
             SELECT *
             FROM Schedule holiday
             WHERE DateDiff(dd,GETDATE(),DateValue) >=1 AND IsPaymentDay = 1 AND IsHoliday = 1
                   AND NOT EXISTS (SELECT *
                                   FROM Schedule
                                   WHERE DateDiff(dd,GETDATE(),Schedule.DateValue) >= 1 AND DateDiff(dd,Schedule.DateValue,holiday.DateValue)>=1
                                         AND Schedule.IsHoliday = 0 AND Schedule.IsPaymentDay=0)
             )
        )
于 2013-06-09T07:06:52.437 に答える
1

SQLステートメントでもこれを実現できます-

SELECT *
  FROM Schedule S1
 WHERE Datevalue = CAST(Getdate() AS DATE)
   AND Datevalue =
       (SELECT MAX(Datevalue)
          FROM Schedule S2
         WHERE Datevalue <= (SELECT MIN(Datevalue)
                               FROM Schedule S3
                              WHERE Datevalue >= S1.Datevalue
                                AND Ispaymentday = 1)
           AND Isholiday = 0);

編集

値を削除できるすべての支払い日を確認するにはgatdate-

 SELECT *
     FROM Schedule S1
     WHERE Datevalue =
           (SELECT MAX(Datevalue)
              FROM Schedule S2
             WHERE Datevalue <= (SELECT MIN(Datevalue)
                                   FROM Schedule S3
                                  WHERE Datevalue >= S1.Datevalue
                                    AND Ispaymentday = 1)
               AND Isholiday = 0);
于 2013-06-09T07:11:37.523 に答える
0

この機能を試してください:

 create Function IsPaymentDate (@date Date) returns int
 as
 begin

     declare @IsPaymentDate int

     select @IsPaymentDate = 
            case DateDiff(dd, max(a.Datevalue), @date)
                 when 0 then 1
                 else 0
            end
     from Schedule a
     where a.Isholiday = 0 and 
           a.Datevalue <= (select min(b.Datevalue) from Schedule b
                          where b.Datevalue >= @date and b.Ispaymentday = 1)         

     return @IsPaymentDate

 end
于 2013-06-09T07:32:06.843 に答える