有效计算运行总量

时间:2014-04-28 16:52:55

标签: php mysql sql database

我无法弄清楚如何在PHP中存储,检索和计算运行余额。它与PHP无关 - 它是更多的编程理论,但无论如何:

想象一下下表:

id | user_id | date       | start_time | end_time | total | balance | notes
19 | 17      | 2014-04-01 | 09:00:00   | 17:30:00 | 7.50  | 0       | 
20 | 18      | 2014-04-02 | 09:00:00   | 18:30:00 | 8     | 0.5     | 
20 | 18      | 2014-04-01 | 09:00:00   | 17:00:00 | 7     | -0.5    | 

显示月份余额相对简单:

  1. 计算当月可用的小时数(2014年4月)。 (我们假设每天工作7.5小时,周末不工作):

    22天* 7.5 = 165小时

  2. 使用SQL计算一个月预订的总时间,例如:

    SELECT SUM(总计)FROM预订日期> ='2014-04-01'和日期< =''2014-04-01';

    // 30

  3. 余额则是总工作时数减去总可用时数:

    30 - 165 = -135

  4. 我需要在多个月内以有效的方式显示这些值的运行总数,因此我不仅希望SUM()总列,因为将来可能有数千行,当然这是效率高达?

    因此我想到了一个running_totals表,每个用户每行一行,无论何时编辑,添加或删除记录,都会自动更新。但是,这可能会有问题,因为前几个月的记录可以更新,不仅需要更新当前月份行,还必须级联到该月前的月份。例如,如果您要返回March更新记录,我将不得不更新3月和4月的running_balance行。

    除非你在running_balance中记录所有记录,并在PHP中计算出余额?随着应用程序的增长,这对我来说似乎效率低下,我宁愿在开始时做到正确。

    其他问题

    我只想计算到目前为止的运行余额,但是你可以在将来预定时间,在计算运行余额时应该忽略这一点。

    目前我是如何做的

    我希望非常快,但我觉得它太复杂了,而且已经有了错误。所以我需要快速获得一个简单有效的解决方案。

    插入新记录

    1. 您第一次在新月预订一天时,我会计算当月可用的总时数(2014年4月EG)

      165

    2. 加载running_balance行(每个用户1个)并减去其中的月总数:

      0 - 165 = -165

    3. 添加当前预订的总数(例如7.5):

      -165 + 7.5 = -157.5

    4. 显示运行余额

      1. 从running_balance加载行。计算当月剩余的小时数。例如,我们是4月28日,所以剩下15个小时(2天* 7.5)。

      2. 将其添加到运行余额中:

        -157.5 + 15 = -142.5

      3. 您的运行余额为:-142.5

      4. 这只是证明过于复杂,有很多边缘情况,特别是在编辑和编辑时。除去。特别是在删除特定月份的最后一个条目时。所以,我想知道是否有一个更简单的方法,你聪明的人可以想到吗?

        感谢。

        PS:代码的来源是:https://github.com/WeareJH/Flexitime 在排除问题和编写文档之前,公众并没有真正使用它,但它可能对上下文有所帮助。

1 个答案:

答案 0 :(得分:1)