Sql-Server

檢測兩個時間段是否重疊

  • February 25, 2022

我有一個 HR 系統,我需要檢測新的休假(休假)請求是否與現有的請求衝突。我已經根據一整天的時間編寫了程式碼來執行此操作;我現在需要根據半天進行比較。

這是我的資料結構(和數據格式)。我正在使用 SQL Server 2008 R2。

StartDate     (datetime)
EndDate       (datetime)

以下 2 個變數顯示使用者是休假半天還是一整天。列出並解釋了每個選項。

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

我將此資訊傳遞給數據庫,並試圖查看新休假是否與現有休假衝突。這是一天的程式碼:

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 天的假期。**人們可以休息一整天或半天(早上或下午)。

我想使用 TSQL 來確定目前的請假請求是否與現有的請求衝突(重疊)並且無法弄清楚如何去做。

我意識到這已經在 Stack Overflow 上得到了回答。它讓我朝著正確的方向前進。

我現在意識到我應該將休假的實際時間戳添加到我的開始日期和結束日期並進行簡單的比較。我希望我幾個月前就知道了。它會為我節省很多痛苦和痛苦。

對於將來遇到類似問題的任何人:

  • 我的新StartDate將被記錄為08/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)
)

引用自:https://dba.stackexchange.com/questions/111426