這是用例:客戶可以在房間中從一個日期注冊到另一個日期。我正在嘗試實作一個日歷,客戶可以在其中單擊一天并獲取可用時間來安排該房間。這是我迄今為止嘗試過的,只有當一天有一個與之關聯的時間表時它才有效:
SELECT {Hours}.*
FROM {Hours}
WHERE {Hours}.[Id] BETWEEN (
SELECT
CASE
WHEN @DateInput = {Schedule}.[StartDate] THEN 0
WHEN @DateInput > {Schedule}.[StartDate] AND @DateInput < {Schedule}.[EndDate] THEN 23
WHEN @DateInput = {Schedule}.[EndDate] THEN {Schedule}.[EndHour]
END
FROM {Schedule}
WHERE {Schedule}.[RoomId] = @RoomInput
) AND (
SELECT
CASE
WHEN @DateInput = {Schedule}.[StartDate] THEN {Schedule}.[StartHour] - 1
WHEN @DateInput > {Schedule}.[StartDate] AND @DateInput < {Schedule}.[EndDate] THEN 0
WHEN @DateInput = {Schedule}.[EndDate] THEN 23
END
FROM {Schedule}
WHERE {Schedule}.[RoomId] = @RoomInput
)
uj5u.com熱心網友回復:
我不熟悉大括號符號,例如{Hours},但我會假設這是一個外系統的東西并使用它運行。
我相信您不需要在兩個值之間選擇小時數,而是需要構建查詢以選擇不屬于任何現有計劃條目的小時數。這可以通過 NOT EXISTS() 條件來完成。就像是:
SELECT H.*
FROM {Hours} H
WHERE NOT EXISTS (
SELECT *
FROM {Schedule} S
WHERE S.RoomId = @RoomInput
AND (S.StartDate < @DateInput
OR (S.StartDate = @DateInput AND S.StartHour <= H.Id))
AND (S.EndDate > @DateInput
OR (S.EndDate = @DateInput AND S.EndHour >= H.Id))
)
如果將日期和時間結合起來,這樣的比較通常更容易撰寫。
WHERE S.RoomId = @RoomInput
AND DATEADD(hour, H.Id, @DateInput)
BETWEEN DATEADD(hour, S.StartHour, S.StartDate)
AND DATEADD(hour, S.EndHour, S.EndDate)
您可能需要根據 EndDate 是包含還是排除來調整結束比較。(EndHour = 10 的時間表條目是在 10:00 還是 11:00 結束?)
有關作業演示,請參閱
- 這個 db<>fiddle使用包含日期。
- 這個 db<>fiddle使用專有的結束日期(從上午 9 點開始的 1 小時會議的 EndHour = 10)。
- 這個 db<>fiddle使用組合日期/時間和獨占結束日期/時間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/441795.html
下一篇:SQL為每個月創建重復客戶
