PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Rails 3.1 :Interroger Postgres pour les enregistrements dans une plage de temps

Vous perdez la trace de vos fuseaux horaires lorsque vous appelez to_date alors ne fais pas ça :

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

Lorsque vous some_date.to_datetime , vous obtenez une instance DateTime qui est en UTC donc le résultat de quelque chose comme ceci :

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

aura une heure du jour de 00:00:00 et un fuseau horaire UTC ; le 00:00:00 est l'heure correcte de la journée dans @person.time_zone mais pas juste pour UTC (sauf, bien sûr, @person est dans le fuseau horaire +0).

Et vous pourriez simplifier votre requête avec des overlaps :

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

Notez que overlaps fonctionne avec des intervalles semi-ouverts :

Chaque période de temps est considérée comme représentant l'intervalle semi-ouvert start <= time < end , sauf si début et fin sont égaux, auquel cas il représente cet instant unique.