2012-10-08 17 views
10

Ho un ambito che richiede le chiamate di oggi. Basato fuori dal campo di applicazione, lo uso per contare la quantità di chiamate per oggi.Interrogazione per intervallo di date nei binari

Le mie date sono memorizzate in UTC ma i binari vengono convertiti nel fuso orario locale. Quello che sto cercando di fare è trovare tutte le chiamate tra oggi alle 00:00 e alle 23:59.

Ambito:

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

uscita IRB: (La chiamata di cattura a causa di 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 

Sto cercando di capire come interrogare solo le chiamate che sono state tra le 00:00 e 23:59 per oggi. Finora il tentativo di esplorare con e senza utc, zone, ecc non funziona. Mantiene l'ambito basato su UTC che include la chiamata di ieri (ieri se è formattata con il fuso orario locale).

Come posso eseguire una query tra le due volte per ottenere l'output corretto? Sono un po 'perso qui.

+0

puoi per favore chiarire le tue domande per favore, significa quale modello hai dato lo scope, e in fondo non hai scritto oggi come scope. –

risposta

7

sono stato in grado di compensare UTC riscrivendo mio campo di applicazione come segue:

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

È possibile utilizzare una gamma esclusiva.

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

Forse questo è eccessivo, ma vi suggerirei di usare un metodo di supporto per ottenere l'intervallo di tempo e quindi l'interrogazione del db. Qualcosa come

# 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 

ti aiuterà a richiedere intervalli di tempo. Quindi quando richiedi qualcosa del genere;

time_range(0, "days") 

restituirà l'intervallo di tempo per 0 giorni fa (oggi);

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

E quindi si può semplicemente interrogare l'oggetto del database e contare tutto all'interno dell'intervallo con;

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

Questo è buono, e grazie per l'esempio, ma ho finito con un semplice lambda scope qualche anno fa :) – nulltek

+0

Nessun problema! Forse per un uso futuro –

Problemi correlati