PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Rails 3.1:Abfrage von Postgres nach Datensätzen innerhalb eines Zeitbereichs

Sie verlieren den Überblick über Ihre Zeitzonen, wenn Sie to_date aufrufen also tu das nicht:

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

Wenn Sie some_date.to_datetime , erhalten Sie eine DateTime-Instanz in UTC, also das Ergebnis von etwa:

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

hat eine Tageszeit von 00:00:00 und eine Zeitzone von UTC; 00:00:00 ist die korrekte Tageszeit in @person.time_zone aber nicht richtig für UTC (außer natürlich @person befindet sich in der Zeitzone +0).

Und Sie könnten Ihre Abfrage mit overlaps vereinfachen :

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

Beachten Sie, dass sich overlaps arbeitet mit halboffenen Intervallen:

Jeder Zeitraum wird als Darstellung des halboffenen Intervalls start <= time < end betrachtet , es sei denn, Start und Ende sind gleich, in diesem Fall stellt es diesen einzelnen Zeitpunkt dar.