【问题标题】:stuck with creating rent table坚持创建租金表
【发布时间】:2011-03-18 22:02:51
【问题描述】:

我想用mysql创建一个php来做以下事情:

假设我有一家要租的商店,租金将是每周或每月。我正在寻找创建此表的最佳方法,这样我就可以通过简单的查询来计算免费的周数或月数。

编辑

假设我有

ID、START_DATE、RENING_TYPE、CLIENT_ID

其中 Start_date 是租用的开始日期,RENTING_TYPE 是每周或每月

我应该如何运行查询以了解所有空闲的周或月,以便新客户可以保留该周/月

例如,一个客户在 7 月预订另一个客户在 6 月的第一周预订,如果一个新客户登录到我的系统并想要查看所有可用的周/月,我该如何实现?

【问题讨论】:

  • 请提供更多信息...此表包含哪些类型的数据以及您将运行哪些类型的查询?
  • 我添加了其他信息,对此感到抱歉
  • +1 根据要求添加其他信息。现在这是一个需要处理的问题。
  • 我认为您应该将第 3 段改写为:lets say that I have a building I want to rent out, rent will be weekly or monthly. I'm searching for the best way to create this table, so I can calculate available weeks or months.

标签: php mysql sql database-design


【解决方案1】:

此查询应返回预订之间的所有空闲时间间隔。如果尚未预订,它会获取所有可疑的免费天数(结束日 + 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 非常生疏,因此语法可能会被关闭,但我认为逻辑是合理的。我希望这至少能让你朝着正确的方向点头!

【讨论】:

    【解决方案2】:

    我无法建议采用整体方法,但建议您首先简化作业。不要试图同时处理几个月和几周,只需专注于几周。您可以使用一点业务逻辑来将一个月等同于四个星期。

    因此,您首先摆脱了 RENTING_TYPE。而是包括预先计算的和准确的工作日期,以及在 WEEKS 中的职业运行时间:

    ID, CLIENT_ID, START_DATE, END_DATE, WEEKS
    

    当商店每周或每月交替租用时,也许 DAYS 会更好地规避粒度问题。不是一个查询专家,所以我实际上更喜欢在 PHP 中循环访问日期,而不是使用自联接等。

    如果这还不够快(商店太多),我什至会设计一个CLIENT_ID=0 填充物来标记空闲点。这极大地简化了搜索,而且更新也不是很困难。

    【讨论】:

      【解决方案3】:

      假设我有一家我想开的店 租金,租金将是每周或每月。 我正在寻找最好的方法 创建这张表,这样我就可以轻松搞定 计算免费周数的查询或 个月。

      如果有人想租用您的商店 18 天,您知道会发生什么吗?你要把它租给他们18天。一只鸟在手。 . .

      • 存储结束日期。 租赁合同总是书面的 有具体的开始日期和结束 日期。
      • 从表中删除rental_type。将其移动到用户界面可能会很方便。但无论是用户界面还是数据库都不应限制您只能租用一周或一个月。
      • 如果 CLIENT_ID 指的是它的所有者 不属于这个表。你 无法说服我所有者是 取决于租期。
      • 如果 CLIENT_ID 指的是租户,它 可能应该在另一个 桌子。虽然有可能你的 业务需求决定了 你只会租给一个人, 租用类似的东西并不罕见 一次购物给几个租户。 他们所有的名字都在出租 协议,通常使他们 共同承担租金。 (之中 其他事情。)
      • 索引开始日期和结束日期列。

      现在,使用 SamG 的查询。

      【讨论】:

        【解决方案4】:

        我假设 START_DATE 是绝对日期(# from 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
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2020-06-07
          • 1970-01-01
          • 2011-12-07
          • 1970-01-01
          • 2017-04-12
          • 1970-01-01
          • 2023-03-07
          • 1970-01-01
          • 2014-12-26
          相关资源
          最近更新 更多