PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Rails 3.1:Consultando Postgres para registros dentro de um intervalo de tempo


Você está perdendo o controle de seus fusos horários quando liga para to_date então não faça isso:
@today    = Time.now.in_time_zone(@person.time_zone).midnight.utc
@tomorrow = @today + 1.day

Quando você some_date.to_datetime , você obtém uma instância DateTime que está em UTC, então o resultado é algo assim:
Time.now.in_time_zone(@person.time_zone).midnight.to_date.to_datetime

terá um horário de 00:00:00 e um fuso horário UTC; a 00:00:00 é a hora correta do dia em @person.time_zone mas não é certo para UTC (a menos, é claro, @person está no fuso horário +0).

E você pode simplificar sua consulta com overlaps :
where(
    '(start_time, end_time) overlaps (timestamp :today, timestamp :tomorrow)',
    :today => @today, :tomorrow => @tomorrow
)

Observe que overlaps funciona com intervalos semi-abertos:

Cada período de tempo é considerado para representar o intervalo semiaberto start <= time < end , a menos que o início e o fim sejam iguais, caso em que representa aquele único instante de tempo.