我现在的处境很复杂。我有一个预订系统,可以预订房间。
问题是,房间的价格不是作为单个值存储的,而是基于时间段的。就像一个房间在 9 月至 12 月期间可以有一个每日房价,从 3 月到 8 月有不同的房价,而在其他情况下则有基本房价。
费率表如下:
ROOMID | RATE | PERIOD_START | PERIOD_END
假设 3 月 1 日至 3 月 31 日期间的房间价格为 20 美元/天,4 月 15 日至 5 月 30 日期间同一房间的价格为 30 美元,此外,价格为 15 美元的统一价格/天。
如果该房间由一名客户在 3 月 15 日至 5 月 10 日期间预订,则总费用为:
15th March - 31st march charged at 20 Dollars/day = 16x20
1st April - 14th April charged at 15 Dollars/day = 14x15
15th April - 10th May charged at 30 Dollars/day = 25x30
现在如何在代码中计算这个值,我需要根据费率周期(如果有)计算天数,否则使用基本费率。它很复杂,但事实就是如此。我正在使用 php MySQL
最佳答案
这是一个可能的解决算法:
- 查找与预订期间有非空交集的所有费率期间
- 对于 (1) 中找到的每个费率周期,计算其与预订周期交集的天数,然后乘以该周期的费率
- 剩余天数(即预订期限的天数减去 (2) 中找到的所有天数的总和就是您的基本费率天数
关于 (1),为了查找哪些费率周期与预订周期相交,请注意 2 个间隔 (A,B)
和(C,D)
有一个空的交叉点 iff D < A or C > B
,所以你可以否定这个条件。应该看起来像:
SELECT * FROM rates
WHERE NOT (booking_end < period_start OR
booking_start > period_end)
对于(2),你只需要找到max(booking_start, period_start)
之间的天数即可。和min(booking_end, period_end)
, 包括的。我确信有一些实用程序可以处理日期,但在最坏的情况下,您可以循环遍历它。
抱歉,但我不是编写实际代码的 SQL/php 向导...:)
关于php - 计算预定义日期范围之间的天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5094800/