1

これは (MS SQL Server 2008) 用です。これにより、ユーザーは他のユーザーの開始日と終了日/時刻を重複することなくスケジュールできます。

スケジュール中に個人を重複させることができないというビジネス ルールに取り組んでいます。例: ユーザー 1 が 2012 年 1 月 1 日から 2012 年 1 月 4 日までにスケジュールされている場合、ユーザー 2 は 2012 年 1 月 2 日から 2012 年 1 月 4 日までのリクエストを送信できません。この部分はすでに処理されており、これが私の SQL です。

SELECT * FROM fooTable
WHERE
    Prim = 1
AND 
    Group = 10
AND
    (('2012-06-01 08:01' between startdate and enddate
   OR '2012-06-03 08:01' between startdate and enddate)
OR
   ('2012-06-01 08:01' < startdate) AND ('2012-06-03 8:01' > enddate))

最後のシフトが終了したときに新しいシフトを開始できるという意味で、スケジュールのオーバーラップを許可する必要があります。例: 私の終了日は 2012 年 1 月 1 日午後 8 時です。2012 年 1 月 1 日と午後 8 時に開始するように誰かをスケジュールできるはずです。

これを熟考する助けが必要です。

4

1 に答える 1

3

Groupまず、列名として使用しないでください。これは、すべての SQL 標準の予約語です。grp回答のために、名前を に変更しました。

'2012-06-01 08:00'からへの新しいシフトをスケジュールしようとしてい'2012-06-03 08:00'ます...

INSERT INTO tbl (prim, grp, startdate, enddate)
SELECT 1, 10, '2012-06-01 08:00', '2012-06-03 08:00'
WHERE  NOT EXISTS (
    SELECT *
    FROM   tbl
    WHERE  prim = 1
    AND    grp = 10
    AND   '2012-06-03 08:00' > startdate -- not >= to allow sharing a border
    AND   '2012-06-01 08:00' < enddate   -- and not BETWEEN ... AND either
    )

比較することに注意してください:

new_end    > old_start
new_start <
 old_end

使用するBETWEEN .. AND ..場合は、テストにシフトの境界を含めます。>=と を使用するのと同じ<=です。>と を使用し<て、境界線の重なりを許可する必要があります。

さて、大幅に簡略化された構文を試してみてください。もともとそこにあったものについてはわかりません。
これは、sqlfiddle.com で動作するデモです。

于 2012-04-23T19:29:50.920 に答える