2014-07-04 81 views
0

我有一個Placements模型,它包含check_in和check_out日期列以及整數字段'places'。我正在嘗試編寫一個查詢(postgres)來計算用戶的總「人員夜」。用戶通過列表提供了多個展示位置,因此對於每個展示位置,我需要以天爲單位查找check_out和check_in日期之間的差異,並將其乘以該展示位置的數量。理想情況下,我可以在一個查詢,大意如下的邏輯線的東西做到這一點:計算rails中兩個日期之間的差異activerecord select語句

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 
+1

你能描述一下'placements'表嗎?如果'check_in'&'check_out'字段確實是'date's(而不是''timestamp's),那麼差異將產生一個整數(以天爲單位),因此您的查詢可以照原樣運行。 – pozs

+0

是的,他們是日期,而不是日期,已添加上面的展示位置表。我會按照你的建議嘗試,手指幾乎穿過 – Dave

+0

,只是給了我「必須出現在GROUP BY子句中或用於聚合函數」的錯誤,所以我只需要將分組正確(此錯誤讓我感到困惑)。理想情況下,它需要吐出一個值而不是一系列的展示位置。 – Dave

回答

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之後)。

+0

我認爲它在正確的軌道上,但我的查詢沒有組仍然給我以下軌道日誌(注內部連接來自關聯current_user.hosted_placements):SELECT SUM((check_out - check_in)* people)as FROM「placements」INNER JOIN「listing」ON「placements」。「listing_id」=「listings」。「id 「WHERE」列表「。」user_id「= $ 1 AND(confirmed_at IS NOT NULL and check_out <'2014-07-05')[[」user_id「,5]] PG :: GroupingError:ERROR:column」placements.check_in 「必須出現在GROUP BY子句中或用於聚合函數 – Dave

+0

剛剛檢查過,如果我只是使用沒有內部聯接的查詢,就會得到相同的錯誤 - SELECT SUM((check_out - check_in)* people)作爲所有FROM」展示位置「WHERE(confir_at IS NOT NULL和check_out <'2014- 07-05') – Dave

+0

明白了,原來activerecord正在把一個ORDER在那裏,這是要求該列在選擇。工作查詢是current_user.hosted_placements.where(「confir_at IS NOT NULL和check_out <?」,Date.today).sum(「(check_out - check_in)* people」) – Dave

相關問題