【问题标题】:Php/MySQL: Hours reported, hourly ratePhp/MySQL:报告的小时数,每小时费率
【发布时间】:2012-03-19 11:40:10
【问题描述】:

我有以下表格(简体):

   hours               hour_rates
 - user_id            - user_id
 - date               - date
 - hours              - hourly_rate

小时表示例:

1 - 2012-03-19 - 8

这意味着 id=1 的用户在 2012-03-19 总共工作了 8 小时。

一个人的小时费率可以随时间变化,所以我有第二张表:

hour_rates 表示例

1 - 2011-12-01 - 20
1 - 2011-12-20 - 25

所以对于 id=1 的用户,我们在 2011 年 12 月 1 日设置了每小时 20 美元的费率。 我们在 2011 年 12 月 20 日将他的时薪改为 25 美元。

我想要的是,计算在给定时期(例如 2012-01-01 -> 2012-02-01)我必须为给定用户(例如 id=1)支付多少费用。

我可以简单地计算一下mysql端吗? 如果没有,如何有效地做到这一点?

【问题讨论】:

  • 你为什么要在 mysql 端这样做——如果你不需要在 mysql 查询中使用结果,你应该在你的代码中进行计算;否则使用存储过程/函数
  • 我建议以不同的方式工作,当您输入时,我会在 hours 表中添加正在使用的小时费率的 ID,这样可以简化一切。跨度>
  • @BenGriffiths 这可能是一个不错的选择。

标签: php mysql


【解决方案1】:

在 hour_rates 表中,您应该有两个日期:start_date 和 end_date,这意味着从 start_date 到 end_date,雇主每小时支付 x$。

然后使用 bpgergo 提出的相同查询修改如下:

   select sum(h.hours * hr.hourly_rate) as pay
   from hours h, hour_rates hr
   where h.user_id = :user_id --here you will set the user id parameter
   and h.user_id = hr.user_id and (h.date BETWEEN hr.start_date AND hr.end_date 
   and h.date between STR_TO_DATE('01,1,2012','%d,%m,%Y') and STR_TO_DATE('01,1,2011','%d,%m,%Y')

【讨论】:

  • 男孩,这太复杂了,在我的意义上......只需使用一张表,在每个条目中输入 user_id、日期、工作时间和 hourly_rate.. 如果有不同一天的小时费率,你只是有更多相同日期的条目......
  • 当然,对于您需要进行的计算,这是一个更简单的解决方案。但是对于其他类型的查询,例如,您的解决方案可能设计不佳。您要显示每小时员工奖励历史记录的图像。例如,从 2011-01-01 到 2011-06-01 每小时 50 美元,从 2011-06-02 每小时 60 美元等等......有了新表,这个计算就不会那么容易了。但是,这取决于您必须进行哪种计算!
  • 不,ab_dev86,你错了对不起,它完全是颠倒的!事实上,我的桌子设计会让这变得非常容易。您拥有完整的工作历史记录,其中包含每天工作的确切 hourly_rate 和小时数。此外,就性能而言,它要快得多且不复杂...
  • 我是 sospicius 关于这样的查询:“告诉我员工何时增加或减少每小时奖励”。在您的新表格布局中,这个查询会怎样?
  • 我猜你没有满足要求,ab_dev86...你听说过数据库规范化吗?拥有两个具有相同条目的表会杀死你......但是,这很容易:SELECT date, hours, hourly_rate FROM hours WHERE user_id=$user_id ORDER BY date;并且从数据库中读取 { 检查 row[hourly_rate] 是否增加或减少,如果是则 echo row[date] }
【解决方案2】:

我可以简单地计算一下mysql端吗?

是的,这是 SQL

select sum(outer_h.hours * 
  (select inner_hr.hourly_rate 
    from hour_rates inner_hr
    where inner_hr.user_id = outer_h.user_id
    and inner_hr.date >= outer_h.date
    order by inner_hr.date asc
    limit 1)
) as pay
  from hours outer_h
  where outer_h.user_id = :user_id --here you will set the user id parameter
  and outer_h.date between STR_TO_DATE('01,1,2012','%d,%m,%Y') and STR_TO_DATE('01,1,2011','%d,%m,%Y')

【讨论】:

  • 看起来是一个非常漂亮的查询。我是 sospicius abuot 的唯一一点是您使用此连接条件和 h.date = hr.date 但 hr.date 意味着从该日期起,雇员每小时有这个现在的价格。假设 hr.date 为 = 2012-01-01,您想计算 2012-01-02 日雇用的金额,但 and 条件失败,查询未返回任何结果。我不确定,应该测试查询...
  • hmm...你说得对,我不够仔细,只是浏览了一下问题并写了一个快速答案。让我解决这个问题。
【解决方案3】:

编辑:那么,抱歉,您需要 2 张桌子吗?它们是完全相等的,如果每天都可以有自己的hourly_rate,你只需要这样存储:

小时:user_id、日期、小时、小时费率

例如1 | 2012-03-19 | 8 | 25

你使用

 SELECT user_id, date, hours, hourly_rate FROM hours WHERE (user_id=$var_of_user_id AND date ...)

然后将每一行的 hours*hourly_rate 相乘并将其添加到 $sum,例如

while {...

$sum=$sum+($row['hours']*$row['hourly_rate']);

}

hourly_rate 取决于什么?可能您不想在 hour_rates 表中包含字段日期。

如果每个工作的 hourly_rate 不同,您希望只有一张表包含 user_id、start_date、end_date(或工作小时数)和 hourly_rate。

如果 hourly_rate 仅取决于 user_id,那么您希望有两个表:

小时数:user_id、start_date、end_date(或工作小时数)

hourly_rate:user_id、hourly_rate

并加入 user_id 上的表。如果您已经有一个表 users,您也可以在其中存储 hourly_rate,在第二种情况下。

然后使用 php 将工作时间简单地乘以 user_id... 等的小时费率。

【讨论】:

  • 对于相同的任务和相同的项目,一个人的小时费率会随时间变化。
  • @Tamas Pap:但是小时费率仍然是固定的,我的意思是,在他工作一小时后它不能改变,50 美元,2 周后你说:嘿,你上周所做的只有 30 美元,对吗?
【解决方案4】:

这个查询应该可以工作:

SELECT SUM( h.hours*COALESCE(hr.hourly_rate,0) ) AS salary
FROM hours h
LEFT JOIN hour_rates hr
ON h.user_id = hr.user_id 
AND  hr.date = ( SELECT MAX(hd.date) FROM hour_rates hd
                 WHERE hd.user_id = h.user_id AND hd.date <= h.date )
WHERE h.user_id = 1
AND h.date BETWEEN '2012-01-01' AND '2012-04-01'

如果没有为给定的用户和日期定义小时工资,则需要合并部分,您可以在此处设置默认费率而不是 0。还要确保 hour_rates 表中的每一对 (user_id,date)是独一无二的。

【讨论】:

    猜你喜欢
    • 2017-07-12
    • 2013-01-17
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多