首页 > 解决方案 > group_by_day 和 sum 工作不正确

问题描述

我有一个代码:

total_rate = company.crews
                    .joins(:assignment)
                    .where(assignments: { date: week[:from]..week[:to] })
                    .group_by_day('assignments.date', format: '%Y-%m-%d')
                    .joins(:workers)
                    .sum('workers.rate')

在输出中,作为一个有 2 名工人的工作人员,我们的费率 = 4,5,应该是 9。这是正确的。

如果在最后一行很容易做到 .sum ('workers.rate'),那么所有内容都会正常分组并汇总。输出是

{13:00 => 9} 9 是 worker.first.rate = 4,worker.last = 5。

但是,在这里,当我尝试将条件乘以更多时间时,结果发现每个worker.reit 都乘以时间差,但是您需要9 * 13:00 的worker rate 数量,

.sum('workers.rate * (time_arriving - time_leaving)')

不是 4 * 13.00 + 5 * 13.00

这就是麻烦...

标签: ruby-on-railsruby

解决方案


假设 Postgres:

'time' - 'time' 将返回一个间隔,将其与整数相乘不会改变类型。

您需要先提取小时数,然后将其乘以费率。此查询向您展示如何获取小时数:

select extract(epoch from time_leaving - time_starting) / 3600 from assignments

请注意,这select extract(hour from time_leaving - time_starting) from assignments只会提取完整的小时数,因此12:00 - 10:15将返回“1”


推荐阅读