我正在使用 ASP.NET 網路表單在 SQL Server 表中存盤STARTTIME和存盤ENDTIME。
timeTableID startTimeVal endTimeVal
-------------------------------------------------
1 07:30:00.0000000 08:00:00.0000000
2 08:00:00.0000000 08:30:00.0000000
3 08:15:00.0000000 08:25:00.0000000
現在,正如您在帶有 的行中看到的那樣timeTableID = 2,插入的時間值為 8:00 和 8:30 AM,
但在帶有 的行中timeTableID = 3,插入的時間值為 8:15 & 8:25 AM,
我不想要這個,因為它在第 2 行的值內。
我的問題是,下一個條目不應該在已經插入的時間之間。
我的嘗試:
select timeTableID
from timetableTbl
where dayVal = 'MONDAY'
and StartTimeVal between '" startTimeTxt.Text "' and '" endTimeTxt.Text "' and endTimeVal between '" startTimeTxt.Text "' and '" endTimeTxt.Text "'
這startTimeTxt是 的文本框startTimeVal和endTimeTxt的文本框endTimeVal。
請在這件事上給予我幫助
uj5u.com熱心網友回復:
聽起來您正試圖在插入之前檢測并避免重疊的時間間隔。對此進行測驗的方法并不明顯,但以下方法有效:給定兩個時間間隔 [start1, end1) 和 [start2, end2),它們重疊 iff (start1 < end2 AND start2 < end1)。
請注意,這特別允許 start1 = end2 或 start2 = end1 的相鄰間隔,這對于連續范圍很常見,并反映了上述記錄 1 和 2 的條件。(如果我們處理離散值和包含范圍,測驗將使用 <= 而不是 <。)
這還假設您希望避免任何重疊,而不僅僅是新間隔完全包含在現有間隔內的情況。例如,給定上面的記錄 1 和 2,您還希望禁止時間間隔 7:15am-7:45am(與記錄 1 的開頭重疊)、8:15am-8:45am(與記錄 2 的結尾重疊)和 6: 00am-12:00pm(兩者完全重疊)。
在這種情況下,檢查沖突間隔將類似于
select timeTableID
from timetableTbl
where dayVal = @day
and StartTimeVal < @endTime
and EndTimeVal > @startTime -- Same as @startTime < EndTimeVal
其中@day、@startTime 和@endTime 是派生自經過驗證的用戶輸入的引數。
uj5u.com熱心網友回復:
列出這些行:
SELECT t2.* FROM tablename AS t
JOIN tablename AS t2
ON t2.timeTableID > t.timeTableID
AND t2.startTimeVal >= t.startTimeVal
AND t2.endTimeVal <= t.endTimeVal
uj5u.com熱心網友回復:
正如@SMor 在評論中指出的那樣,除了 SQL 注入攻擊的危險之外,您的問題似乎表明這些行以錯誤的順序回傳。
這可以通過在查詢中添加 ORDER BY 子句來解決:
SELECT timeTableID
FROM timetableTbl
WHERE dayVal = 'MONDAY'
AND StartTimeVal BETWEEN @startTime AND @endTime
AND EndTimeVal BETWEEN @startTime AND @endTime
ORDER BY StartTimeVal, EndTimeVal;
請注意,我已將 SQL 轉換為引數化查詢。
現在,結果將按照 StartTimeVal 的順序回傳。如果兩行具有相同的 StartTimeVal,它們將按其 EndTimeVal 排序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404956.html
標籤:
