Sql 如何使用递归cte确定背靠背使用的租赁可用性
我正在制定一个程序,该程序将确定一个实体是否有足够的租赁设备在规定的时间内支付其所有租金 我们还有一项新功能,允许客户在场地关闭时提取设备 但是,我们也允许背靠背租赁,这意味着在实体关闭时,单个设备可以有多个租赁 我需要一种方法来确定假设所有的租金都被及时取回,是否有足够的设备来支付所有的预订 我尝试使用递归CTE来确定这一点,但我无法进一步提高我的最大递归限制,并且由于一些租金不到一小时,我必须在最多30分钟的时间段内测量日期 不过,这也是我第一次使用递归cte,所以我可能犯了一个错误 我的例子如下:Sql 如何使用递归cte确定背靠背使用的租赁可用性,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,我正在制定一个程序,该程序将确定一个实体是否有足够的租赁设备在规定的时间内支付其所有租金 我们还有一项新功能,允许客户在场地关闭时提取设备 但是,我们也允许背靠背租赁,这意味着在实体关闭时,单个设备可以有多个租赁 我需要一种方法来确定假设所有的租金都被及时取回,是否有足够的设备来支付所有的预订 我尝试使用递归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)
如果我假设你的时间快到了,那么01:00:00真的意味着25:00:00,那么我相当理解你的问题 我不太确定如何处理领带,但以下内容将返回您想要的:
select top (1) t.id, v.time, sum(inc) over (order by time, id) as overlaps
from t cross apply
(values (pickuptime, 1), (dropofftime, -1)) v(time, inc)
order by overlaps desc;
他是一把小提琴
不需要使用递归CTE。你只需要对每次上下车进行说明,这可以用累计金额来完成。如果我假设你的时间快到了,那么01:00:00实际上意味着25:00:00,那么我很理解你的问题 我不太确定如何处理领带,但以下内容将返回您想要的:
select top (1) t.id, v.time, sum(inc) over (order by time, id) as overlaps
from t cross apply
(values (pickuptime, 1), (dropofftime, -1)) v(time, inc)
order by overlaps desc;
他是一把小提琴
不需要使用递归CTE。您只需对每次取车和下车进行说明,这可以通过累计金额来完成。您的数据没有意义。你的数据没有意义,怎么能在取货时间之前就计算下车时间呢。下车时间怎么可能早于上车时间?对不起,我搞错了。这是24小时制,所以01:00是第二天的凌晨1点。我应该在原来的帖子上写上日期。这种方法还会这样吗?列数据类型是日期时间。@Taktical1。是的,这种方法仍然适用于日期时间。我感谢您的帮助,非常感谢!我将此应用于我的proc,并针对几个不同的场景进行了测试。这正是我所需要的。对不起,我弄错了。这是24小时制,所以01:00是第二天的凌晨1点。我应该在原来的帖子上写上日期。这种方法还会这样吗?列数据类型是日期时间。@Taktical1。是的,这种方法仍然适用于日期时间。我感谢您的帮助,非常感谢!我将此应用于我的proc,并针对几个不同的场景进行了测试。这正是我所需要的。