我有一个展示位置模型,其中包含check_in和check_out日期列,以及整数字段'places'。我正在尝试编写一个查询(postgres)来计算用户的“人 - 夜”总数。用户在列表中有多个展示位置,因此对于每个展示位置,我需要找到check_out和check_in日期之间的差异,并将其乘以该展示位置中的展示位置数。理想情况下,我可以在一个查询中执行此操作,类似于以下逻辑:
hosted_personnights_count = current_user.hosted_placements
.select("SUM((placements.check_out - placements.check_in)*placements.people) as datediff")
.where("placements.confirmed_at IS NOT NULL and placements.check_out < ?", Date.today)
.group(:user_id)
显然这不是正确的语法,但我认为解释这种方式比尝试列出我尝试过的所有不起作用的postgres函数更容易。有任何想法吗?展示位置表格如下所示:
create_table "placements", force: true do |t|
t.integer "user_id"
t.integer "listing_id"
t.date "check_in"
t.date "check_out"
t.integer "people"
t.datetime "confirmed_at"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
答案 0 :(得分:0)
您的查询很简单
SELECT SUM((check_out - check_in) * people) AS all
FROM placements
WHERE confirmed_at IS NOT NULL
AND check_out < ?
AND user_id = ?
如果您想要将全部加起来,那么您不需要GROUP BY
条款。
并确保您不会意外地选择其他列(all
之后)。