2012-10-08 75 views
10

我有一個查詢今天調用的範圍。基於範圍我用它來計算今天的通話量。在rails中查詢日期範圍

我的日期以UTC格式存儲,但導軌轉換爲我的本地時區。我想要做的是在今天00:00和23:59之間查找所有電話。

範圍:

scope :today, where("DATE(transfer_date) BETWEEN ? AND ?", Time.zone.now.utc.beginning_of_day, Time.zone.now.utc.end_of_day) 

IRB輸出(在抓到由於UTC調用)

irb(main):010:0> Call.last.transfer_date 
    Call Load (0.9ms) SELECT "calls".* FROM "calls" ORDER BY "calls"."id" DESC LIMIT 1 
=> Sun, 07 Oct 2012 19:45:00 CDT -05:00 
irb(main):011:0> 

irb(main):011:0> Call.last.transfer_date.utc 
    Call Load (1.3ms) SELECT "calls".* FROM "calls" ORDER BY "calls"."id" DESC LIMIT 1 
=> 2012-10-08 00:45:00 UTC 

我試圖找出如何查詢僅是00:00之間的呼叫和今天23:59。到目前爲止,嘗試使用或不使用utc,zone等都不起作用。它不斷拉動基於UTC的範圍,其中包括來自昨天的呼叫(昨天如果它與本地時區格式化)。

如何在兩次之間查詢以獲取正確的輸出?我有點迷失在這裏。

+0

請問您能否明確提出您的問題,意味着您提供範圍的模型,以及您今天沒有寫作範圍的底層模型。 –

回答

7

我能夠通過重寫我的範圍,以彌補UTC如下:

scope :today, where("transfer_date BETWEEN ? AND ?", Time.zone.now.beginning_of_day, Time.zone.now.end_of_day) 
13

您可以使用排除範圍。

scope :today, where(:transfer_date => Date.today...Date.tomorrow) 
0

也許這是矯枉過正,但我​​會建議使用助手方法獲取時間範圍,然後查詢數據庫。類似於

# Gets time range for x number timeunits ago 
    def time_range(unit, timeunit = nil) 
    if timeunit == "weeks" 
     now = Time.zone.now.beginning_of_week 
    elsif timeunit == "months" 
     now = Time.zone.now.beginning_of_month 
    else 
     now = Time.zone.now.beginning_of_day 
    end 
    # Ex: time_range(0, "days") --> Get the time range for today between the beginning of today and the beginning of tommorow - 1 second 
    now - unit.send(timeunit)..now + 1.send(timeunit) - 1.seconds - unit.send(timeunit) 
    end 

將幫助您請求時間範圍。所以當你請求類似的東西時;

time_range(0, "days") 

它將返回0天前(今天)的時間範圍;

Wed, 07 Sep 2016 00:00:00 UTC +00:00..Wed, 07 Sep 2016 23:59:59 UTC +00:00 

然後,您可以簡單地查詢數據庫對象並計算範圍內的所有內容;

Calls.where(transfer_date: time_range(unit, timeunit)).count 
+0

這很好,感謝這個例子,但是我最終在幾年前用了一個簡單的lambda範圍:) – nulltek

+0

沒問題的人!也許供將來使用 –