Я работаю над процедурой, которая определит, достаточно ли у предприятия арендного оборудования, чтобы покрыть всю его аренду в течение определенного периода времени.
У нас также есть новая функция, которая позволяет клиентам забирать свое оборудование, пока локация закрыта.
Тем не менее, мы также разрешаем одновременную аренду, то есть одна единица оборудования может иметь несколько арендных плат, пока предприятие закрыто.
Мне нужен способ определить (при условии, что все арендные платы забраны и возвращены вовремя), достаточно ли оборудования для покрытия всех бронирований.
Я попытался использовать рекурсивный CTE, чтобы определить это, но я не могу продвинуть свой максимальный предел рекурсии дальше, и, поскольку некоторые аренды меньше часа, я должен измерить даты максимум30 минутных блоков.
Хотя я также впервые использую рекурсивный cte, поэтому я мог ошибиться.
Мой пример выглядит следующим образом:
ID PickupTime DropOffTime
--- ------------------------------------- ------------------------------------
1 2019-2-28 23:00:00.000 2019-3-01 00:00:00.000
2 2019-3-01 00:00:00.000 2019-3-01 01:00:00.000
3 2019-3-01 04:00:00.000 2019-3-01 07:00:00.000
4 2019-2-28 22:00:00.000 2019-2-28 23:00:00.000
5 2019-2-2819:00:00.000 2019-2-28 21:00:00.000
6 2019-2-28 20:00:00.000 2019-2-28 22:00:00.000
7 2019-2-28 23:00:00.000 2019-3-01 01:00:00.000
8 2019-2-28 23:00:00.000 2019-3-01 01:00:00.000
9 2019-3-01 00:00:00.000 2019-3-01 02:00:00.000
10 2019-2-28 21:00:00.000 2019-2-28 22:00:00.000
11 2019-2-28 22:00:00.000 2019-2-28 23:00:00.000
And Equipment
ID EquipmentNumber
-- ---------------
1 AB123
2 AC321
3 BL854
Из-за того, что я понял это на бумаге, я знаю, что для их покрытия требуется минимум 4 оборудования.Таким образом, это должно возвращать логическое значение с указанием «да» или «нет» (в данном случае «нет»), если все оговорки могут быть покрыты.
Это то, что я пытался:
DECLARE @MinprefDate DATETIME = (SELECT MIN(PreferredPickupDate) FROM #Results)
DECLARE @MaxprefDate DATETIME = (SELECT MAX(PreferredPickupDate) FROM #Results)
DECLARE @MinexpDate DATETIME = (SELECT MIN(ExpectedReceiveDate) FROM #Results)
DECLARE @MaxexpDate DATETIME = (SELECT MAX(ExpectedReceiveDate) FROM #Results)
;WITH CTE AS (
SELECT 1 AS n, r.ID, r.ContractID, @MinprefDate AS PreferredPickupDate, @MinexpDate AS ExpectedReceiveDate, r.PreviousPickup, r.PreviousExpected, r.NextPickup, r.NextExpected
FROM #Results r
UNION ALL
SELECT n + 1, ID, ContractID, DATEADD(MINUTE, 1, @MinprefDate), DATEADD(MINUTE, 1, @MaxexpDate), PreviousPickup, PreviousExpected, NextPickup, NextExpected FROM CTE
WHERE ExpectedReceiveDate <= @MaxexpDate
)
SELECT * FROM CTE OPTION (MaxRecursion 3000)