2012-10-08 7 views
10

Ich habe einen Bereich, der für heutige Anrufe abfragt. Basierend auf dem Umfang zähle ich die Anzahl der Anrufe für heute.Abfragen des Datumsbereichs in Schienen

Meine Daten werden in UTC gespeichert, aber die Schienen werden in meine lokale Zeitzone konvertiert. Was ich versuche zu tun ist, alle Anrufe zwischen heute um 00:00 und 23:59 zu finden.

Scope:

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

irb Ausgang: (Der Anruf es aufgrund UTC fängt)

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 

Ich versuche, herauszufinden, wie man nur Anrufe abzufragen, die zwischen 00.00 Uhr waren und 23:59 für heute. Bisher funktioniert der Versuch, mit und ohne utc, zone usw. zu screenen, nicht. Es zieht den Bereich basierend auf UTC fort, der den Anruf von gestern einschließt (gestern, wenn er mit der lokalen Zeitzone formatiert ist).

Wie kann ich zwischen den beiden Zeiten abfragen, um die richtige Ausgabe zu erhalten? Ich bin hier irgendwie verloren.

+0

können Sie bitte bitte Ihre Fragen klar machen, bedeutet, welches Modell Sie Umfang gegeben haben, und im Grunde haben Sie heute nicht als Anwendungsbereich geschrieben. –

Antwort

7

konnte ich für UTC kompensieren, indem mein Umfang umschreiben wie folgt:

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

können Sie eine exklusive Auswahl verwenden.

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

Vielleicht ist das übertrieben, aber ich würde vorschlagen, eine Hilfsmethode für das Erhalten des Zeitbereiches und dann die db abfragt. Etwas wie

# 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 

wird Ihnen helfen, Zeitbereiche anzufragen. Also, wenn Sie etwas wie verlangen;

time_range(0, "days") 

es gibt den Zeitbereich für 0 Tage (heute) zurück;

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

Und dann können Sie einfach das Datenbankobjekt abfragen und alles innerhalb des Bereichs mit zählen;

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

Das ist gut, und danke für das Beispiel, aber ich endete mit einem einfachen Lambda-Oszilloskop vor ein paar Jahren :) – nulltek

+0

Kein Problem Mann! Vielleicht für den zukünftigen Gebrauch –

Verwandte Themen