php - 计算预定义日期范围之间的天数

标签 php mysql algorithm sql-optimization

我现在的处境很复杂。我有一个预订系统,可以预订房间。

问题是,房间的价格不是作为单个值存储的,而是基于时间段的。就像一个房间在 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) 中找到的每个费率周期,计算其与预订周期交集的天数,然后乘以该周期的费率
  3. 剩余天数(即预订期限的天数减去 (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/

相关文章:

php - 单选按钮 php mysql

php - 将模块添加到 bonfire 中的新上下文中

php - PHP代码既不产生结果也不产生错误

php - 从 Laravel 中外键连接的两个表返回结果。

mysql - 重用 phpbb 连接向 mysql 添加一条记录

JavaScript:在两个数组中查找公共(public)元素的性能改进

javascript - 阻止 URL 漏洞

php - 如何为图表制作事件日志

c# - 在排序列表中搜索值时如何节省 CPU 周期?

c - 使用 srand() 避免重复生成种子