web-dev-qa-db-ja.com

2つの期間が重複しているかどうかを検出する

人事システムを持っていますが、新しい休暇(休暇)リクエストが既存のリクエストと競合するかどうかを検出する必要があります。私はこれを終日行うためのコードを書きました。半日で比較する必要があります。

これが私のデータ構造(およびデータ形式)です。 SQL Server 2008 R2を使用しています。

_StartDate     (datetime)
EndDate       (datetime)
_

次の2つの変数は、ユーザーが半日または丸1日休暇を取るかどうかを示します。それぞれのオプションがリストされ、説明されています。

_StartDateAMPM (int) 0=All Day (StartDate may or may not be the same as the EndDate), 
                    1=AM, (User is out of the office only in the morning)
                    2=PM  (User is out of the office only in the afternoon)

EndDateAMPM   (int) 0="All Day" / "half day" / "StartDate = EndDate", 
                    1=AM (The user is off for the morning only)

**NOTE This cannot be PM (as you cannot end a leave with a half day in the afternoon)

**IF this is a "0", there are 3 possibilities --
A) a full day leave where the StartDate <> EndDate
B) a full day where the StartDate = EndDate
C) a partial day where StartDate = EndDate 
   and the user is off in the morning or the afternoon
_

この情報をデータベースに渡し、新しい休暇が既存の休暇と競合するかどうかを確認しようとしています。これは、1日間実行するためのコードです。

_Legend:  @Start DateTime -- StartDate from new leave
         @end   DateTime -- EndDate from new leave
         @StartDateAMPM (int) 0,1,2 (see above for details)
         EndDateAMPM    (int) 0,1   (see above for details)
_
_select count(ID)  
from v_VacReqWHalfDays 
where 
(
        @Start BETWEEN StartDate and EndDate 
    OR  @End   BETWEEN StartDate and EndDate 
    OR  
    (
        @Start <= StartDate 
        AND @End >=EndDate
    )
)
AND kUserID = @UserID;
_

Count(ID) > 0の場合、競合があります。

私の質問は、1/2日の休暇を組み込む方法です。人々は、丸1日または半日(朝または午後)休暇を取ることができます。

TSQLを使用して、現在の休暇申請が既存の休暇申請と競合する(重複する)かどうかを判断し、その方法を理解できないのですが。

6
Dan B

私はこれが スタックオーバーフローで以前に回答されました であることを理解しています。それは私を正しい方向に導きました。

休暇の実際のタイムスタンプを開始日と終了日に追加し、簡単な比較を行う必要があることに気付きました。数か月前にこれを理解できたらよかったのに。それは私に多くの痛みと苦しみを救わせたでしょう。

同様の問題を抱えている将来の誰にとっても:

  • 新しいStartDate08/22/2015 09:00.000ではなく08/22/2015 00:00.000として記録されます
  • EndDate8/23/2015 13:00:00.000になります

次に、リンクされた回答に従って比較できます:

(
    (@Start > StartDate and @Start < EndDate)
    OR (@End > StartDate and @End < EndDate)
    OR (@Start < StartDate and @End >EndDate)
)
2
Dan B