我正在为客户开发一个住宿预订平台,需要利用基于日期范围的动态定价。有多种定价范围,称为季节。例如,旺季,旺季和淡季可以有不同的定价水平。
我还应该声明我正在使用CakePHP -尽管这并不会真正影响它-所以我不一定能做出硬核MySQL查询,但我将非常感谢这些类型的答案,因为我可能能够在Cake中实现原始的MySQL查询。
下面是我的场景:
- 用户选择在2015-08-15 - 2015-09-15期间预订住宿(例如)
- 旺季费率从2015-08-15至2015-08-30,
- 季中费率从2015-09-01 - 2015-09-30(再次,作为例子)。
- 用户停留时间现在分为两个定价区间(15天)高峰和中期15天)
定价不像每晚x元那么简单,但现在这无关紧要。
如何最好地计算这个价格,假设高峰价格每晚50美元,中间价格每晚25美元?将日期范围和相应的成本存储到数组(并遍历它们)的解决方案是否优于返回成本总和的原始MySQL查询?根据一年中预订时段的不同,大概有5个季节类型,我想要返回最相关的一个可能会很棘手。
对于这一挑战的任何启示都是非常感谢的。
亲切的问候,西蒙。
我没有兴趣告诉你什么是"最好的",但我会给你一些建议
DROP TABLE IF EXISTS rates;
CREATE TABLE rates
(season_id INT NOT NULL PRIMARY KEY
,season_type VARCHAR(12)
,season_start DATE NOT NULL
,season_end DATE NOT NULL
,rate INT NOT NULL
);
INSERT INTO rates VALUES
(1,'Peak','2015-08-15','2015-08-30',50),
(1,'Mid' ,'2015-09-01','2015-09-30',25);
SELECT * FROM rates;
+-----------+-------------+--------------+------------+------+
| season_id | season_type | season_start | season_end | rate |
+-----------+-------------+--------------+------------+------+
| 1 | Peak | 2015-08-15 | 2015-08-30 | 50 |
| 2 | Mid | 2015-09-01 | 2015-09-30 | 25 |
+-----------+-------------+--------------+------------+------+
SELECT x.*
, DATEDIFF(season_end,'2015-08-15')
FROM rates x
WHERE '2015-08-15' >= season_start
UNION
SELECT x.*
, DATEDIFF('2015-09-15',season_start)
FROM rates x
WHERE '2015-09-15' <= season_end;
+-----------+-------------+--------------+------------+------+-----------------------------------+
| season_id | season_type | season_start | season_end | rate | DATEDIFF(season_end,'2015-08-15') |
+-----------+-------------+--------------+------------+------+-----------------------------------+
| 1 | Peak | 2015-08-15 | 2015-08-30 | 50 | 15 |
| 2 | Mid | 2015-09-01 | 2015-09-30 | 25 | 14 |
+-----------+-------------+--------------+------------+------+-----------------------------------+
注意八月有31天