sql >> Base de Datos >  >> RDS >> PostgreSQL

Rails 3.1:consultando Postgres para registros dentro de un rango de tiempo

Estás perdiendo la noción de tus zonas horarias cuando llamas a to_date así que no hagas eso:

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

Cuando some_date.to_datetime , obtiene una instancia de DateTime que está en UTC, por lo que el resultado es algo como esto:

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

tendrá una hora del día de 00:00:00 y una zona horaria de UTC; las 00:00:00 es la hora del día correcta en @person.time_zone pero no para UTC (a menos, por supuesto, @person está en la zona horaria +0).

Y podría simplificar su consulta con overlaps :

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

Tenga en cuenta que overlaps funciona con intervalos entreabiertos:

Se considera que cada período de tiempo representa el intervalo semiabierto start <= time < end , a menos que el inicio y el final sean iguales, en cuyo caso representa ese único instante de tiempo.