Php / MySQL:小时报告,小时费率

时间:2012-03-19 11:40:11

标签: php mysql

我有以下表格(简化):

   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-01设置了每小时20美元的费率。 我们将2011-12-20的小时费率改为25美元。

我想要的是,计算给定时期内给定用户(例如id = 1)需要支付的费用(例如2012-01-01 - &gt; 2012-02-01)。< / p>

我可以简单地计算这个mysql方面吗? 如果没有,如何以有效的方式做到这一点?

4 个答案:

答案 0 :(得分:1)

  

我可以简单地计算这个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')

答案 1 :(得分: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')

答案 2 :(得分:1)

编辑:很抱歉,但你需要2张桌子呢?它们是完全平等的,如果每天都有自己的hourly_rate,你只需要像这样存储:

  

小时:user_id,date,hours,hourly_rate

e.g。 1 | 2012-03-19 | 8 | 25

您使用

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

然后乘以每行小时* 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上加入表。如果您已有表用户,则可以在第二种情况下存储hourly_rate。

然后使用php简单地将工作小时数与user_id等的小时费率相乘

答案 3 :(得分:1)

此查询应该有效:

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)是独一无二的。