PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Rails 3.1:Interrogazione di Postgres per i record entro un intervallo di tempo

Stai perdendo il conto dei tuoi fusi orari quando chiami to_date quindi non farlo:

@today    = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day

Quando some_date.to_datetime , ottieni un'istanza DateTime che è in UTC, quindi il risultato di qualcosa del genere:

Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime

avrà un'ora del giorno di 00:00:00 e un fuso orario UTC; le 00:00:00 è l'ora del giorno corretta in @person.time_zone ma non adatto per UTC (a meno che, ovviamente, @person è nel fuso orario +0).

E potresti semplificare la tua query con overlaps :

where(
    '(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
    :today => @today, :tomorrow => @tomorrow
)

Nota che overlaps funziona con intervalli semiaperti:

Ogni periodo di tempo è considerato rappresentare l'intervallo semiaperto start <= time < end , a meno che inizio e fine non siano uguali, nel qual caso rappresenta quel singolo istante di tempo.