我想创建一个带有mysql的php来执行以下操作:
假设我有一个我想租的商店,租金是每周或每月。我正在寻找创建此表的最佳方法,因此我可以轻松查询以计算免费的数周或数月。
修改
让我说我有
ID,START_DATE,RENING_TYPE,CLIENT_ID
其中Start_date是租借的开始日期,RENTING_TYPE是每周或每月
如何运行查询以了解所有空的周或月,以便新客户可以保留该周/月
例如客户保留7月份另一个客户预留6月的第一周,如果新客户登录到我的系统并想要检查所有可用的周/月,我该如何实现?
答案 0 :(得分:2)
此查询应返回预订之间的所有空闲间隔。如果尚未预订,它将获得所有可疑的免费日(结束日+ 1),然后搜索以查找下一个预订日。给你这样的输出
Start Free | End Free
-----------------------
2011-02-03 | 2011-02-06
2011-02-08 | 2011-02-12
2011-02-20 | 2011-03-02
然后,您可以使用PHP获取其间的确切日期。
查询:
SELECT DATE_ADD(r2.end_date, INTERVAL 1 DAY),
(
SELECT DATE_SUB(MIN(starting_date), INTERVAL 1 DAY)
FROM renting_table as r1
WHERE r1.starting_date > r2.end_date
)
FROM renting_table as r2
WHERE DATE_ADD(end_date, INTERVAL 1 DAY) not in
(
SELECT r3.start_date
FROM renting_table as r3
)
注意:我对SQL非常生疏,所以语法可能会关闭,但我认为逻辑是合理的。我希望这至少让你朝着正确的方向点头!
答案 1 :(得分:1)
我无法建议整体方法,但建议您先简化分配。而不是试图处理数月和数周,只需专注于几周。您可以使用一些业务逻辑来等同一个月到四周。
因此你开始摆脱RENTING_TYPE。而是包含预先计算的和准确的日期,以及WEEKS中的职业运行时间:
ID, CLIENT_ID, START_DATE, END_DATE, WEEKS
当商店每周或每月交替出租时,也许DAYS可以更好地规避粒度问题。不是一个查询专家,所以我实际上更喜欢在PHP中循环使用日期而不是使用自联接等。
如果这还不够快(商店太多),我甚至会设计一个CLIENT_ID=0
填充物来标记自由点。这极大地简化了搜索,并且更新并不困难。
答案 2 :(得分:0)
我假设START_DATE是绝对日期(#从1.1.1970开始),RENTING_TYPE是持续时间(通过JOIN或只是)。因此,您的脚本将执行以下操作(我没有用语言描述抱歉)
//$reservations = array(start_date => object(id=>1,duration=>7,etc..))
$remainingReservedDays = 0;
for($day = $start;$day < $end;$day++){
if($remainingReservedDays > 0){
echo 'reserved day<br />';//or grayed out checkbox or whatever
$remainingReservedDays--;
} else if(isset($reservations[$day])){ //new reservation starting today
echo 'reserved<br />';//TODO: make me DRY
$remainingReservedDays = $reservations[$day]->duration;
} else {
echo 'free atleast for a week';
//TODO check if available for month
//lookup next reservation start_date
}
}
答案 3 :(得分:0)
让我说我有一个我想要的商店 租金,租金,每周或每月。 我正在寻找最好的方式 创建这个表,所以我可以轻松做到 查询计算免费周或 个月。
你知道如果有人想租你的店铺18天会发生什么事吗?你打算把它租给他们18天。一只鸟在手中。 。
现在,使用SamG的查询。