5


4

SQL Server 2008の一意の日付範囲フィールド

特に、StartTimeとEndTimeという2つのフィールドで構成されるテーブルがあります。 どちらもTIMEフィールドです。

既存の時間範囲と重複するレコードの挿入を防止する制約を追加します。 E.g. StartTime = 5:00、EndTime = 10:00のレコードが既に存在する場合、StartTime = 6:00、EndTime = 9:00の挿入は、オーバーラップのため失敗します。

トリガーの有無にかかわらず、これを達成する方法はありますか?

3 Answer


5


以下のトリガーは動作するはずです-チェック制約でこれを行うことも可能ですが、http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/03/08/storing-intervals-of-timeに示されているロジック- with-no-overlaps.aspx [この投稿]は、私の頭を痛めます。

CREATE TRIGGER [dbo].[DateRangeTrigger]
   ON  [dbo].[TargetTable]
   FOR INSERT, UPDATE
AS
BEGIN

IF EXISTS (SELECT t.starttime, t.endtime FROM TargetTable t
        Join inserted i
        On (i.starttime > t.starttime AND i.starttime < t.endtime AND i.UniqueId <> t.UniqueId)
           OR (i.endtime < t.endtime AND i.endtime > t.starttime AND i.UniqueId <> t.UniqueId)
           OR (i.starttime < t.starttime AND i.endtime > t.endtime AND i.UniqueId <> t.UniqueId)
        )
BEGIN
    RAISERROR ('Inserted date was within invalid range', 16, 1)
    IF (@@TRANCOUNT>0)
        ROLLBACK
END


END


4


私はそれを試していませんが、このようなものがうまくいくと思います:

create trigger preventOverlaps
on infotable
FOR Insert, Update
As
DECLARE @Count int;
select @Count = count(*) from infotable where
  (inserted.startdate > startDate && inserted.startdate < endDate) ||
  (inserted.endDate < endDate && inserted.endDate > startDate)
if(@Count > 0)
begin
   rollback transaction;
end


2


このトリガーは、1つのタイムスパンがもう1つのタイムスパンを完全に含む状況でも機能します。 たとえば、6:00の既存のレコードがある場合 - 9:00と5:00から10:00の間に挿入しようとします。
(デビッドホールの回答に基づく)

CREATE TRIGGER DateRangeOverlapTrigger
ON  TargetTable
FOR INSERT, UPDATE
AS
BEGIN
IF EXISTS
    (SELECT t.UniqueId
    FROM TargetTable t
        JOIN inserted i ON i.starttime < t.endtime
            AND i.endtime > t.starttime
            AND i.UniqueId <> t.UniqueId)
BEGIN
    RAISERROR ('Invalid due to time overlap', 16, 1)
    IF (@@TRANCOUNT > 0)
        ROLLBACK
END
END