我有以下表格(简化):
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方面吗? 如果没有,如何以有效的方式做到这一点?
答案 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)
小时: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)是独一无二的。